Comment déterminer si quelque chose a changé dans update trigger dans T-sql

Comment puis-je déterminer si quelque chose a changé dans UPDATE trigger? Par exemple, j'ai table named person avec un seul nom de colonne qui contient la valeur "Mike". Si je run

UPDATE person SET NAME = 'Mike' 

comment puis-je déterminer le déclencheur de mise à jour, rien n'a changé? Je sais que sur Mise à jour (col) déclaration, mais je ne veux pas itérer sur les colonnes. Est-il un autre moyen pour accomplir cette?

19
demandé sur Tshepang 2012-05-11 15:15:14

2 réponses

Update (column) indique simplement que column a participé à update, mais pas que sa valeur a changé. Par exemple,

update Person SET Name = Name

donne true dans update (nom) même si le nom n'a pas été changé dans une rangée.

Pour vérifier si de nouvelles valeurs diffèrent des anciens, vous employez sauf parce que excepté supprimera les lignes de l'ensemble supérieur qui existent dans l'ensemble inférieur. Comme la table de la personne a probablement clé principale il n'y a pas de danger d'enlever l'article changé qui a une contrepartie dans supprimé. Toutefois, si vous décidez de changer * pour une liste d'intéressant colonnes assurez-vous d'inclure clé primaire.

insert into logTable (ID)
select a.ID
from
(
   select * from Inserted
   except
   select * from Deleted
) a

L'avantage ajouté est que cela fonctionne pour les insertions aussi parce que supprimé sera vide et toutes les lignes de insered seront retournées.

34
répondu Nikola Markovinović 2016-01-20 11:19:50

se référant à la réponse D'Arion ci-dessus:

assurez - vous de comparer les enregistrements par leur clé primaire lors de la sélection d'une jointure puisque les tables insérées et supprimées peuvent contenir plus d'un enregistrement, qui - si ignoré-peut entraîner à la fois des résultats de requête erronés et un impact négatif sur la performance de DB.

-- Anrion's answer - slightly modified
CREATE TRIGGER UpdatedTriggerName
ON person -- table name
AFTER UPDATE
AS 
IF EXISTS (
    SELECT
        *
    FROM
        INSERTED I
        JOIN
        DELETED D
            -- make sure to compare inserted with (same) deleted person
            ON D.ID = I.ID 
            AND D.NAME <> I.NAME -- only persons with changed name
    )
print 'something'
GO
17
répondu DeMo 2013-09-24 16:12:04