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?
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.
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