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'
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top