Unterschied zwischen FOR- und AFTER-Triggern?

120

Was ist der Unterschied zwischen FORund AFTERAuslöser?

sqlchild
quelle
5
+1: Ich habe den SQL Server Books Online-Artikel über Trigger gelesen und am Ende genau dieselbe Frage gestellt
pfunk
Ich fand diesen Artikel nützlich: dotnettricks.com/learn/sqlserver/…
Matt

Antworten:

153

Es gibt keinen Unterschied, sie machen das Gleiche.

CREATE TRIGGER trgTable on dbo.Table FOR INSERT,UPDATE,DELETE

Ist das gleiche wie

CREATE TRIGGER trgTable on dbo.Table AFTER INSERT,UPDATE,DELETE

Ein INSTEAD OFTrigger ist anders und wird vor und anstelle der Einfügung ausgelöst und kann für Ansichten verwendet werden, um die entsprechenden Werte in die zugrunde liegenden Tabellen einzufügen.

Ben
quelle
14
Ich mochte den Kommentar zu Einfügungen in Ansichten mit Triggern. Sehr nützliche Infos. Prost.
Mariusz
Entschuldigung, Herr @Ben, was wäre das Szenario, um es in eine Ansicht einzufügen ? Danke ^ - ^
Jeancarlo Fontalvo
@ JeancarloFontalvo, 1) Kompatibilität. Die zugrunde liegenden Tabellen können sich ändern, sofern die Ansicht unverändert bleibt. 2) Zugriffskontrolle, bestimmte Benutzer haben möglicherweise die Berechtigung, nur in bestimmte Spalten zu schreiben.
Ben
17

@ Ben ist absolut richtig.

Hier ist der MSDN-Artikel Erkunden von SQL Server-Triggern

Ein Absatz aus dem Artikel:

Diese Syntax ist auch in älteren Versionen von SQL Server akzeptabel. Da es in SQL Server 2000 nun zwei Arten von Triggern gibt, bezeichne ich FOR-Trigger lieber als AFTER-Trigger. Daher werde ich im weiteren Verlauf dieses Artikels entweder auf NACH oder STATT Trigger verweisen.

Wie der AFTER-Trigger, den Sie zuvor gesehen haben, verhindert dieser Trigger, dass Änderungen am Feld Nachname vorgenommen werden. Diese Geschäftsregel wird jedoch anders als im vorherigen Beispiel implementiert. Da der INSTEAD OF-Trigger anstelle der UPDATE-Anweisung ausgelöst wird, wertet der INSTEAD OF-Trigger aus, ob der Geschäftsregel-Test bestanden wurde oder nicht. Wenn der Geschäftsregel-Test erfolgreich ist, muss der INSTEAD OF-Trigger die UPDATE-Anweisung erneut explizit aufrufen, damit die Aktualisierung erfolgt.

Waqas Raja
quelle
4

AFTER gibt an, dass der DML-Trigger nur ausgelöst wird, wenn alle in der auslösenden SQL-Anweisung angegebenen Vorgänge erfolgreich ausgeführt wurden. Alle referenziellen Kaskadenaktionen und Einschränkungsprüfungen müssen ebenfalls erfolgreich sein, bevor dieser Trigger ausgelöst wird. AFTER ist die Standardeinstellung, wenn FOR das einzige angegebene Schlüsselwort ist.

AFTER-Trigger können in Ansichten nicht definiert werden.

STATT AN Gibt an, dass der DML-Trigger anstelle der auslösenden SQL-Anweisung ausgeführt wird, wodurch die Aktionen der auslösenden Anweisungen überschrieben werden. STATT OF kann nicht für DDL- oder Anmeldetrigger angegeben werden.

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql

Nour El-Hoda
quelle
1
Diese Formulierung "AFTER ist die Standardeinstellung, wenn FOR das einzige angegebene Schlüsselwort ist." ist sehr verwirrend. Sie hätten es besser formulieren können.
FMFF