Wie kann man in einem Auslöser überprüfen, ob sich keine Felder geändert haben?

dba.stackexchange https://dba.stackexchange.com/questions/11896

  •  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'
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top