sp_settriggerorder (Transact-SQL)
Aktualisiert: 12. Dezember 2006
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.
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 vom Datentyp 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.Wichtig: 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 für die Verwendung mit DDL-Triggern 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 SQL Server 2005-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- oder LOGON-Trigger ist, gibt das Argument an, ob triggername mit einem Datenbankbereich oder einem Serverbereich erstellt wurde. Beachten Sie, dass LOGON-Trigger nur mit Serverbereich erstellt werden können. 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
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.
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
Wenn Sie die Reihenfolge eines DDL- oder LOGON-Triggers mit Serverbereich (erstellt ON ALL SERVER) festlegen möchten, benötigen Sie die Berechtigung CONTROL SERVER.
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 AdventureWorks;
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 AdventureWorks
-Datenbank ausgelöst wird.
USE AdventureWorks;
GO
sp_settriggerorder @triggername= 'ddlDatabaseTriggerLog', @order='First', @stmttype = 'ALTER_TABLE', @namespace = 'DATABASE';
Siehe auch
Verweis
Gespeicherte Systemprozeduren (Transact-SQL)
Gespeicherte Prozeduren für das Datenbankmodul (Transact-SQL)
ALTER TRIGGER (Transact-SQL)
Hilfe und Informationen
Informationsquellen für SQL Server 2005
Änderungsverlauf
Version | Verlauf |
---|---|
12. Dezember 2006 |
|