Angeben des ersten und des letzten Triggers

Gilt für:SQL ServerAzure SQL-DatenbankVerwaltete Azure SQL-InstanzSQL-Datenbank in Microsoft Fabric

Sie können festlegen, dass einer der mit einer Tabelle verknüpften AFTER-Trigger entweder der erste oder der letzte AFTER-Trigger ist, der für jede der Triggeraktionen INSERT, DELETE und UPDATE ausgelöst wird. Die AFTER-Trigger, die zwischen dem ersten und letzten Trigger ausgelöst werden, werden in einer nicht definierten Reihenfolge ausgeführt.

Um die Ausführungsreihenfolge für einen AFTER-Trigger anzugeben, verwenden Sie die gespeicherte Prozedur sp_settriggerorder . sp_settriggerorder besitzt die folgenden Optionen.

Option Beschreibung
First Gibt an, dass der DML-Trigger der erste AFTER-Trigger ist, der bei einer auslösenden Aktion ausgelöst wird.
Zuletzt Gibt an, dass der DML-Trigger der letzte AFTER-Trigger ist, der für eine Triggeraktion ausgelöst wird.
None Gibt an, dass keine besondere Reihenfolge vorhanden ist, in der der DML-Trigger ausgelöst werden soll. Wird hauptsächlich verwendet, um einen Trigger zurückzusetzen, sodass er weder der erste noch der letzte ist.

Das folgende Beispiel zeigt die Verwendung von sp_settriggerorder:

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

Wichtig

Der erste und der letzte Trigger müssen zwei unterschiedliche DML-Trigger sein.

Eine Tabelle kann gleichzeitig mit INSERT, UPDATE und DELETE Triggern definiert sein. Jeder Anweisungstyp kann über eigene erste und letzte Trigger verfügen; es darf sich dabei jedoch nicht um dieselben Trigger handeln.

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

INSTEAD OF-Trigger können nicht als erste oder letzte Trigger angegeben werden. INSTEAD OF-Trigger werden ausgelöst, bevor Aktualisierungen an den zugrunde liegenden Tabellen vorgenommen werden. Wenn die Updates an zugrunde liegenden Tabellen durch einen INSTEAD OF-Trigger vorgenommen werden, erfolgen die Updates, bevor einer der für die Tabelle definierten AFTER-Trigger ausgelöst wird. Wenn beispielsweise ein INSTEAD OF-Trigger INSERT in einer Ansicht Daten in eine Basistabelle einfügt und die Basistabelle selbst einen INSTEAD OF-Trigger INSERT und drei AFTER-Trigger INSERT enthält, wird der INSTEAD OF-Trigger INSERT 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 Auslöser ändert, wird das Attribut "First " oder "Last " gelöscht, und der Orderwert wird auf "None" festgelegt. Die Reihenfolge muss mit sp_settriggerorderzurückgesetzt werden.

Die OBJECTPROPERTY-Funktion meldet, ob ein Trigger ein erster oder letzter Trigger ist, indem die folgenden Eigenschaften verwendet werden: ExecIsFirstInsertTrigger, ExecIsFirstUpdateTrigger, ExecIsFirstDeleteTrigger, ExecIsLastInsertTrigger, ExecIsLastUpdateTrigger und ExecIsLastDeleteTrigger.

Die Replikation generiert automatisch einen ersten Trigger für jede Tabelle, die in einem Abonnement mit sofortiger Aktualisierung oder einem Abonnement mit Aktualisierung über Warteschlange enthalten ist. Für die Replikation gilt, dass ihr Trigger der erste Trigger sein muss. Die Replikation gibt einen Fehler zurück, wenn Sie versuchen, eine Tabelle, für die bereits ein Trigger definiert ist, in ein Abonnement mit sofortiger Aktualisierung oder Warteschlangenaktualisierung aufzunehmen. Wenn Sie versuchen, einen Trigger als ersten Trigger festzulegen, nachdem eine Tabelle in ein Abonnement aufgenommen wurde, meldet sp_settriggerorder einen Fehler. Wenn Sie ALTER für den Replikationstrigger verwenden oder sp_settriggerorder verwenden, um den Replikationstrigger auf einen Trigger vom Typ LAST oder NONE festzulegen, funktioniert das Abonnement nicht ordnungsgemäß.

Siehe auch

OBJEKTEIGENSCHAFT (Transact-SQL)
sp_settriggerorder (Transact-SQL)