sp_settriggerorder (Transact-SQL)

Gibt die AFTER-Trigger an, die zuerst oder zuletzt ausgelöst werden. Die AFTER-Trigger, die zwischen dem ersten und letzten Trigger ausgelöst werden, werden in einer nicht definierten Reihenfolge ausgeführt.

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

Syntax

sp_settriggerorder [ @triggername = ] '[ triggerschema. ] triggername' 
        , [ @order = ] 'value' 
        , [ @stmttype = ] 'statement_type' 
        [ , [ @namespace = ] { 'DATABASE' | 'SERVER' | NULL } ]

Argumente

  • [ @triggername= ] '[ triggerschema**.] triggername'**
    Der Name des Triggers, dessen Reihenfolge ggf. festgelegt oder geändert wird, und das Schema, zu dem er gehört. [triggerschema**.**]triggername ist sysname. Wenn der Name keinem Trigger entspricht oder wenn er einem INSTEAD OF-Trigger entspricht, gibt die Prozedur einen Fehler zurück. triggerschema kann nicht für DDL- oder LOGON-Trigger angegeben werden.

  • [ @order= ] 'value'
    Die Einstellung für die neue Triggerreihenfolge. value ist vom Datentyp varchar(10) und kann einen der folgenden Werte annehmen.

    Wichtiger HinweisWichtig

    Der First- und Last-Trigger müssen zwei verschiedene Trigger sein.

    Wert

    Beschreibung

    First

    Trigger wird zuerst ausgelöst

    Last

    Trigger wird zuletzt ausgelöst

    Keine

    Trigger wird in nicht definierter Reihenfolge ausgelöst

  • [ @stmttype= ] 'statement_type'
    Gibt an, von welcher SQL-Anweisung der Trigger ausgelöst wird. statement_type ist vom Datentyp varchar(50) und kann die Werte INSERT, UPDATE, DELETE oder LOGON annehmen oder ein beliebiges Transact-SQL-Anweisungsereignis sein, das in DDL-Ereignisse aufgeführt ist. Ereignisgruppen können nicht angegeben werden.

    Ein Trigger kann für einen Anweisungstyp erst als First- oder Last-Trigger festgelegt werden, nachdem er als Trigger für diesen Anweisungstyp definiert wurde. Ein Trigger TR1 kann beispielsweise als First-Trigger für INSERT-Anweisungen für die T1-Tabelle festgelegt werden, wenn TR1 als INSERT-Trigger definiert ist. Die Database Engine (Datenbankmodul) gibt einen Fehler zurück, wenn TR1, der nur als INSERT-Trigger definiert wurde, als First- oder Last-Trigger für eine UPDATE-Anweisung festgelegt wird. Weitere Informationen finden Sie im Abschnitt mit Hinweisen.

  • @namespace= { 'DATABASE' | 'SERVER' | NULL }
    Wenn triggername ein DDL-Trigger ist, gibt das Argument an, ob triggername mit einem Datenbankbereich oder einem Serverbereich erstellt wurde. Wenn triggername ein LOGON-Trigger ist, muss SERVER angegeben werden. Weitere Informationen zum Bereich von DDL-Trigger finden Sie unter Entwerfen von DDL-Triggern. Wenn das Argument nicht angegeben oder wenn NULL angegeben ist, ist triggername ein DML-Trigger.

Rückgabecodewerte

0 (Erfolg) oder 1 (Fehler)

Hinweise

DML-Trigger

Für eine Tabelle kann es für jede Anweisung nur einen First- und einen Last-Trigger geben.

Wenn bereits ein First-Trigger für die Tabelle, die Datenbank oder den Server definiert ist, können Sie keinen neuen Trigger als First-Trigger für dieselbe Tabelle, Datenbank oder denselben Server für denselben statement_type-Wert bestimmen. Diese Einschränkung gilt auch für Last-Trigger.

Die Replikation generiert automatisch einen ersten Trigger für jede Tabelle, die in einem sofort oder über eine Warteschlange aktualisierbaren Abonnement enthalten ist. Für die Replikation gilt, dass ihr Trigger der erste Trigger sein muss. Die Replikation meldet einen Fehler, wenn Sie versuchen, eine Tabelle, die einen ersten Trigger aufweist, in ein sofort oder über eine Warteschlange zu aktualisierendes Abonnement einzufügen. Wenn Sie versuchen, einen Trigger als ersten Trigger zu definieren, nachdem eine Tabelle in ein Abonnement eingefügt wurde, gibt sp_settriggerorder einen Fehler zurück. Wenn Sie ALTER TRIGGER für den Replikationstrigger verwenden oder mit sp_settriggerorder den Replikationstrigger in einen Last- oder None-Trigger ändern, wird das Abonnement nicht ordnungsgemäß ausgeführt.

DDL-Trigger

Wenn für das gleiche Ereignis ein DDL-Trigger mit einem Datenbankbereich und ein DDL-Trigger mit einem Serverbereich vorhanden ist, können Sie festlegen, dass beide Trigger First- oder Last-Trigger sind. Trigger mit einem Serverbereich werden jedoch immer zuerst ausgelöst. Im Allgemeinen ist die Reihenfolge der Auslösung von DDL-Triggern für das gleiche Ereignis Folgende:

  1. Der als First gekennzeichnete Trigger auf Serverebene

  2. Weitere Trigger auf Serverebene

  3. Der als Last gekennzeichnete Trigger auf Serverebene

  4. Der als First gekennzeichnete Trigger auf Datenbankebene

  5. Weitere Trigger auf Datenbankebene

  6. Der als Last gekennzeichnete Trigger auf Datenbankebene

Allgemeine Überlegungen zu Triggern

Wenn eine ALTER TRIGGER-Anweisung den ersten oder letzten Trigger ändert, wird das Attribut First oder Last, das ursprünglich für den Trigger festgelegt wurde, gelöscht und der Wert durch None ersetzt. Die Reihenfolge muss mit sp_settriggerorder wiederhergestellt werden.

Wenn derselbe Trigger für mehr als einen Anweisungstyp als erster oder letzter in der Reihenfolge festgelegt werden muss, muss sp_settriggerorder für jeden Anweisungstyp ausgeführt werden. Des Weiteren muss der Trigger zuerst für einen Anweisungstyp definiert werden, bevor er als First- oder Last-Trigger festgelegt werden kann, der für den Anweisungstyp ausgelöst wird.

Berechtigungen

Um die Reihenfolge eines DDL-Triggers mit Serverbereich (erstellt ON ALL SERVER) oder eines LOGON-Triggers festzulegen, ist die CONTROL SERVER-Berechtigung auf dem Server erforderlich.

Um die Reihenfolge eines DDL-Triggers mit Datenbankbereich (erstellt ON DATABASE) festzulegen, benötigen Sie die Berechtigung ALTER ANY DATABASE DDL TRIGGER.

Um die Reihenfolge eines DML-Triggers festzulegen, benötigen Sie die ALTER-Berechtigung für die Tabelle oder Sicht, in der der Trigger definiert wurde.

Beispiele

A. Festlegen der Auslösereihenfolge für einen DML-Trigger

Im folgenden Beispiel wird angegeben, dass Trigger uSalesOrderHeader der erste Trigger ist, der nach Abschluss eines UPDATE-Vorgangs in der Sales.SalesOrderHeader-Tabelle ausgelöst wird.

USE AdventureWorks2008R2;
GO
sp_settriggerorder @triggername= 'Sales.uSalesOrderHeader', @order='First', @stmttype = 'UPDATE';

B. Festlegen der Auslösereihenfolge für einen DDL-Trigger

Im folgenden Beispiel wird angegeben, dass Trigger ddlDatabaseTriggerLog der erste Trigger ist, der nach einem ALTER_TABLE-Ereignis in der AdventureWorks2008R2-Datenbank ausgelöst wird.

USE AdventureWorks2008R2;
GO
sp_settriggerorder @triggername= 'ddlDatabaseTriggerLog', @order='First', @stmttype = 'ALTER_TABLE', @namespace = 'DATABASE';