Wie kann man in einem Auslöser überprüfen, ob sich keine Felder geändert haben?
-
16-10-2019 - |
Frage
Wenn wir eine Update -Anweisung erhalten, die nicht prüft, ob sich der Wert in der Where -Klausel geändert hat, wie können Sie dieses Update in einem Auslöser ignorieren?
Ich weiß, dass wir einen Vergleich jedes einzelnen Feldes durchführen können (auch mit der ISNull -Seite), aber wo es sich um eine Tabelle mit über 50 Feldern handelt, gibt es eine schnellere/einfachere Möglichkeit, dies zu tun?
Hinweis: Dies könnte verwendet werden, um IO/Rauschen in Prüfungsunterlagen usw. zu reduzieren ...
BEISPIEL
Für eine Tabelle von:
CREATE TABLE myTest
(ID int NOT NULL IDENTITY(1,1),
Field1 varchar(10) NULL,
Field2 varchar(20) NULL)
Mit einem After -Updater -Auslöser mit:
INSERT INTO myTestAudit (ID, Field1, Field2, DateTimeUpdate)
SELECT ID, Field1, Field2, getDate()
FROM inserted
mit Anfangswerten:
INSERT INTO myTest (Field1, Field2)
SELECT 'a', 'b' UNION ALL
SELECT 'a', 'c'
Führen Sie nun ein Update aus:
UPDATE myTest set Field2 = 'b' WHERE Field1 = 'a'
Lösung
Um Zeilen zurückzubringen, wo sich mindestens ein Wert geändert hat, können Sie verwenden
SELECT /*TODO: Column List*/
FROM INSERTED I
JOIN DELETED D
ON I.ID = D.ID
AND EXISTS (SELECT I.*
EXCEPT
SELECT D.*)
Andere Tipps
Setzen Sie dies als die allererste Zeile in Ihrem Abzug ein:
-- Exit trigger if no data was actually modified
IF (@@ROWCOUNT = 0) return
Ich mache das in all meinen Audit -Triggern. Es ist kurz und auf den Punkt gebracht, schneidet definitiv die verschwendete E/O ab.
UPDATE: Entschuldigung, ich habe Ihre Frage falsch verstanden. Ich dachte, Sie haben gefragt, wie Sie den Auslöser beenden, wenn sich keine Daten geändert haben.