Dans un déclencheur, comment vérifier si aucun champs ont changé?
-
16-10-2019 - |
Question
Si nous recevons une déclaration de mise à jour qui ne vérifie pas si la valeur a changé dans la clause where, quelles sont les différentes façons d'ignorer cette mise à jour dans un déclencheur?
Je sais que nous pouvons faire une comparaison de chaque champ (manipulation du côté ISNULL aussi bien), mais où il est une table qui a plus de 50 champs, est-il un moyen de le faire? Plus rapide / plus facile
Note: Cela pourrait être utilisé pour réduire IO / bruit dans les dossiers de vérification, etc ...
Exemple
Pour une table de:
CREATE TABLE myTest
(ID int NOT NULL IDENTITY(1,1),
Field1 varchar(10) NULL,
Field2 varchar(20) NULL)
avec un après déclenchement de mise à jour contenant:
INSERT INTO myTestAudit (ID, Field1, Field2, DateTimeUpdate)
SELECT ID, Field1, Field2, getDate()
FROM inserted
avec les valeurs initiales:
INSERT INTO myTest (Field1, Field2)
SELECT 'a', 'b' UNION ALL
SELECT 'a', 'c'
Maintenant exécutez une mise à jour:
UPDATE myTest set Field2 = 'b' WHERE Field1 = 'a'
La solution
To bring back rows where at least one value has changed you can use
SELECT /*TODO: Column List*/
FROM INSERTED I
JOIN DELETED D
ON I.ID = D.ID
AND EXISTS (SELECT I.*
EXCEPT
SELECT D.*)
Autres conseils
Put this as the very first line in your trigger:
-- Exit trigger if no data was actually modified
IF (@@ROWCOUNT = 0) return
I do this in all of my audit triggers. It is short and to the point, definitely cuts down on wasted I/O.
Update: Sorry, I misread your question. I thought you asked how to exit the trigger if no data has changed.