web-dev-qa-db-fra.com

Dans un déclencheur, comment vérifier si aucun champ n'a changé?

Si nous recevons une instruction de mise à jour qui ne vérifie pas si la valeur a changé dans la clause WHERE, quelles sont les différentes manières d'ignorer cette mise à jour dans un déclencheur?

Je sais que nous pouvons faire une comparaison de chaque champ individuel (gérer le côté isnull également), mais où il s'agit d'une table qui compte plus de 50 champs, y a-t-il un moyen plus rapide/plus facile de le faire?

Remarque: cela pourrait être utilisé pour réduire l'IO/bruit dans les enregistrements d'audit, 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 autre déclencheur 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'

Organisez maintenant une mise à jour:

UPDATE myTest set Field2 = 'b' WHERE Field1 = 'a'
4
Andrew Bickerton

Pour ramener des lignes où au moins une valeur a changé, vous pouvez utiliser

SELECT /*TODO: Column List*/
FROM   INSERTED I
       JOIN DELETED D
         ON I.ID = D.ID
            AND EXISTS (SELECT I.*
                        EXCEPT
                        SELECT D.*)  
4
Martin Smith

Mettez ceci comme la toute première ligne de votre déclencheur:

-- Exit trigger if no data was actually modified
IF (@@ROWCOUNT  = 0)  return

Je fais cela dans tous mes déclencheurs d'audit. Il est court et à ce point, réduit définitivement les I/O gaspillés.

Mise à jour: Désolé, j'ai mal interprété votre question. Je pensais que vous avez demandé comment sortir de la gâchette si aucune donnée n'a changé.

1
datagod