Freigeben über


Angeben der ersten und letzten Auslöser

Sie können angeben, dass einer der AFTER-Trigger, die einer Tabelle zugeordnet sind, entweder der erste oder der letzte AFTER-Trigger ist, der bei jedem INSERT-, DELETE- und UPDATE-Vorgang ausgeführt wird. Die AFTER-Trigger, die zwischen den ersten und letzten Triggern ausgelöst werden, werden in nicht definierter Reihenfolge ausgeführt.

Um die Reihenfolge für einen AFTER-Trigger festzulegen, wird die gespeicherte Prozedur sp_settriggerorder verwendet. sp_settriggerorder verfügt über die folgenden Optionen.

Auswahlmöglichkeit BESCHREIBUNG
Erste Gibt an, dass der DML-Trigger der erste AFTER-Trigger ist, der bei einer auslösenden Aktion aktiviert wird.
Letzte Gibt an, dass der DML-Trigger der letzte AFTER-Trigger ist, der für eine auslösende Aktion ausgelöst wurde.
Nichts Gibt an, dass es keine bestimmte Reihenfolge gibt, in der der DML-Trigger ausgelöst werden soll. Wird hauptsächlich verwendet, um einen Trigger aus dem Zustand "zuerst" oder "zuletzt" zurückzusetzen.

Das folgende Beispiel zeigt die Verwendung von sp_settriggerorder:

sp_settriggerorder @triggername = 'MyTrigger', @order = 'first', @stmttype = 'UPDATE'  

Von Bedeutung

Die ersten und letzten Trigger müssen zwei unterschiedliche DML-Trigger sein.

Eine Tabelle kann EINFG-, UPDATE- und DELETE-Trigger gleichzeitig definiert haben. Jeder Anweisungstyp kann über eigene erste und letzte Trigger verfügen, sie können jedoch nicht die gleichen Trigger sein.

Wenn der erste oder letzte trigger, der für eine Tabelle definiert ist, keine auslösende Aktion abdeckt, z. B. nicht für FOR UPDATE, FOR DELETE oder FOR INSERT, gibt es keinen ersten oder letzten Trigger für die fehlenden Aktionen.

INSTEAD OF-Trigger können nicht als erste oder letzte Trigger festgelegt werden. INSTEAD OF-Trigger werden ausgelöst, bevor Aktualisierungen an den zugrunde liegenden Tabellen vorgenommen werden. Wenn Aktualisierungen durch einen INSTEAD OF-Trigger für zugrunde liegende Tabellen vorgenommen werden, treten die Updates auf, bevor die in der Tabelle definierten AFTER-Trigger ausgelöst werden. Wenn beispielsweise ein INSTEAD OF INSERT-Trigger in einer Ansicht Daten in eine Basistabelle einfügt und die Basistabelle selbst einen INSTEAD OF INSERT-Trigger und drei AFTER INSERT-Trigger enthält, wird der INSTEAD OF INSERT-Trigger in der Basistabelle anstelle der Einfügeaktion ausgelöst, und die AFTER-Trigger in der Basistabelle werden nach jeder einzufügenden Aktion in der Basistabelle ausgelöst. Weitere Informationen finden Sie unter DML Triggers.

Wenn eine ALTER TRIGGER-Anweisung einen ersten oder letzten Trigger ändert, wird das Attribut "First " oder "Last " verworfen, und der Orderwert wird auf "None" festgelegt. Die Bestellung muss mithilfe von sp_settriggerorder zurückgesetzt werden.

Die OBJECTPROPERTY-Funktion meldet, ob ein Trigger ein erster oder letzter Trigger ist, indem die Eigenschaften ExecIsFirstTrigger und ExecIsLastTrigger verwendet werden.

Die Replikation generiert automatisch einen ersten Auslöser für jede Tabelle, die bei einer sofortigen Aktualisierung oder einer Warteschlangenaktualisierung enthalten ist. Der Trigger muss der erste Auslöser sein, damit die Replikation funktioniert. Bei der Replikation wird ein Fehler ausgelöst, wenn Sie versuchen, eine Tabelle mit einem ersten Trigger in eine sofortige Aktualisierung oder in die Warteschlange eingereihtes Aktualisierungsabonnement einzuschließen. Wenn Sie versuchen, einen ersten Trigger auszulösen, nachdem eine Tabelle in ein Abonnement eingeschlossen wurde, gibt sp_settriggerorder einen Fehler zurück. Wenn Sie ALTER für den Replikationstrigger verwenden oder sp_settriggerorder verwenden, um den Replikationstrigger in einen letzten oder keinen Trigger zu ändern, funktioniert das Abonnement nicht ordnungsgemäß.

Siehe auch

OBJECTPROPERTY (Transact-SQL)
sp_settriggerorder (Transact-SQL)