Auslösen des Feuers, obwohl keine Reihen betroffen sind

10

Dies ist eher eine allgemeine Frage, aber die Motivation für diese Frage war ein Problem, mit dem ich bei der Verwendung von SQL Server konfrontiert war.

Ich habe diesen Trigger an ein Insert-Ereignis in einer Tabelle angehängt, die eine Logik enthält, die als Nebeneffekt einen Fehler auslösen würde, wenn keine Zeilen eingefügt würden. Bei weiteren Untersuchungen stellte ich fest, dass der Abzug ausgelöst wurde, obwohl keine Zeilen eingefügt wurden.

Die in Microsoft Docs on DML Triggers verwendete Sprache scheint diesem Verhalten zu widersprechen:

DML-Trigger ist eine spezielle Art von gespeicherter Prozedur, die automatisch wirksam wird, wenn ein DML-Ereignis auftritt, das sich auf die im Trigger definierte Tabelle oder Ansicht auswirkt.

Ist dies ein Standardverhalten in DBMS? Gibt es einen bestimmten Grund, einen Trigger auszulösen, wenn keine Zeilen betroffen sind?

Luís Gabriel de Andrade
quelle

Antworten:

24

Für DML-Aktionen gibt es zeilenbasierte und anweisungsbasierte Trigger.

  • Zeile löst Feuer aus, wenn (vor, nach oder anstelle von) jede Zeile betroffen ist (eingefügt / aktualisiert / gelöscht). Sie werden also 100 Mal ausgelöst, wenn 100 Zeilen betroffen sind, und überhaupt nicht, wenn 0 Zeilen betroffen sind.

  • Anweisung löst Feuer aus, wenn eine INSERT / UPDATE / DELETEAnweisung ausgeführt wird. Es spielt keine Rolle, ob keine Zeilen betroffen sind. Die Anweisungsebene löst ohnehin und nur einmal ein Feuer für eine Anweisung aus (unabhängig davon, ob 0, 100 oder eine Milliarde Zeilen betroffen sind).

Einige DBMS haben nur Trigger auf Zeilenebene (MySQL).

Andere (wie SQL Server *, das Ihr DBMS ist) haben nur Trigger auf Anweisungsebene.

Einige andere (DB2, Oracle, Postgres) haben beide Arten von Triggern.


* Status der SQL Server- CREATE TRIGGERDokumente :

DML-Trigger werden ausgeführt, wenn ein Benutzer versucht, Daten über ein DML-Ereignis (Data Manipulation Language) zu ändern. DML Ereignisse sind INSERT, UPDATEoder DELETEAussagen auf einer Tabelle oder Sicht. Diese Auslöser werden ausgelöst, wenn ein gültiges Ereignis ausgelöst wird, unabhängig davon, ob Tabellenzeilen betroffen sind oder nicht.

ypercubeᵀᴹ
quelle