sp_settriggerorder (Transact-SQL)
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance
Gibt die AFTER
Trigger an, die zuerst oder zuletzt ausgelöst werden. Die AFTER
Trigger, die zwischen dem ersten und dem letzten Trigger ausgelöst werden, werden in nicht definierter Reihenfolge ausgeführt.
Transact-SQL-Syntaxkonventionen
Syntax
sp_settriggerorder
[ @triggername = ] N'triggername'
, [ @order = ] 'order'
, [ @stmttype = ] 'stmttype'
[ , [ @namespace = ] 'DATABASE' | 'SERVER' | NULL ]
[ ; ]
Argumente
[ @triggername = ] N'triggername'
Der Name des Triggers und des Schemas, zu dem es gehört, falls zutreffend, dessen Reihenfolge festgelegt oder geändert werden soll. @triggername ist nvarchar(517), ohne Standard und befindet sich im Format [ trigger_schema . ] trigger_name. Wenn der Name keinem Trigger entspricht oder der Name einem INSTEAD OF
Trigger entspricht, gibt die Prozedur einen Fehler zurück. Für DDL- oder Anmeldetrigger kann kein Schema angegeben werden.
[ @order = ] 'order'
Die Einstellung für die neue Reihenfolge des Triggers. @order ist varchar(10) und kann eine der folgenden Werte sein.
Wert | Beschreibung |
---|---|
First |
Trigger wird zuerst ausgelöst |
Last |
Trigger wird zuletzt ausgelöst |
None |
Trigger wird in nicht definierter Reihenfolge ausgelöst |
Wichtig
Die First
Auslöser Last
müssen zwei verschiedene Trigger sein.
[ @stmttype = ] 'stmttype'
Gibt die Transact-SQL-Anweisung an, die den Trigger auslöst. @stmttype ist varchar(50) und kann ein in DDL-Ereignissen aufgeführtes T-SQL-Anweisungsereignis seinLOGON
UPDATE
INSERT
DELETE
. Ereignisgruppen können nicht angegeben werden.
Ein Trigger kann nur dann als First
Last
Trigger für einen Anweisungstyp festgelegt werden, nachdem dieser Trigger als Trigger für diesen Anweisungstyp definiert wurde. Beispielsweise kann der Trigger TR1
für INSERT
die Tabelle T1
festgelegt First
werden, wenn TR1
er als INSERT
Trigger definiert ist. Die Datenbank-Engine gibt einen Fehler zurück, wenn , der TR1
nur als INSERT
Trigger definiert wurde, als EinFirst
- oder Last
Auslöser für eine UPDATE
Anweisung festgelegt wird. Weitere Informationen finden Sie im Abschnitt Hinweise.
@namespace = { 'DATABASE' | 'SERVER' | NULL }
Wenn @triggername ein DDL-Trigger ist, gibt @namespace an, ob @triggername mit Datenbankbereich oder Serverbereich erstellt wurde. Wenn @triggername ein Anmeldetrigger ist, SERVER
muss angegeben werden. Weitere Informationen zum DDL-Triggerbereich finden Sie unter DDL-Trigger. Wenn nicht angegeben oder NULL
angegeben, ist @triggername ein DML-Trigger.
Rückgabecodewerte
0
(Erfolg) und 1
(Fehler).
Hinweise
In diesem Abschnitt werden Überlegungen für DML -Trigger (Data Manipulation Language) und Datendefinitionssprachen (Data Definition Language, DDL) erläutert.
DML-Trigger
Es kann nur ein First
und ein Last
Trigger für jede Anweisung in einer einzelnen Tabelle vorhanden sein.
Wenn bereits ein First
Trigger für die Tabelle, Datenbank oder den Server definiert ist, können Sie keinen neuen Auslöser für First
dieselbe Tabelle, Datenbank oder denselben Server für denselben @stmttype festlegen. Diese Einschränkung gilt auch für Last
Trigger.
Die Replikation generiert automatisch einen ersten Trigger für alle Tabellen, die in einem Abonnement mit sofortigem Update oder verzögertem Update über eine Warteschlange enthalten sind. Die Replikation erfordert, dass der Trigger der erste Trigger ist. Die Replikation meldet einen Fehler, wenn Sie versuchen, eine Tabelle, die einen ersten Trigger aufweist, in ein Abonnement mit sofortigem Update bzw. verzögertem Update über eine Warteschlange einzufügen. Wenn Sie versuchen, einen Trigger für einen ersten Auslöser zu erstellen, nachdem eine Tabelle in einem Abonnement enthalten ist, sp_settriggerorder
wird ein Fehler zurückgegeben. Wenn Sie den Replikationstrigger verwenden ALTER TRIGGER
oder zum Ändern des Replikationstriggers in einen Last
oder None
Auslöser verwendensp_settriggerorder
, funktioniert das Abonnement nicht ordnungsgemäß.
DDL-Trigger
Wenn ein DDL-Trigger mit Datenbankbereich und ein DDL-Trigger mit Serverbereich für dasselbe Ereignis vorhanden ist, können Sie angeben, dass beide Trigger ein First
Trigger oder ein 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:
- Der trigger auf Serverebene markiert
First
- Andere Trigger auf Serverebene
- Der trigger auf Serverebene markiert
Last
- Der trigger auf Datenbankebene markiert
First
- Andere Trigger auf Datenbankebene
- Der trigger auf Datenbankebene markiert
Last
Allgemeine Überlegungen zu Triggern
Wenn eine ALTER TRIGGER
Anweisung einen ersten oder letzten Auslöser ändert, wird das First
ursprünglich Last
für den Trigger festgelegte Attribut gelöscht, und der Wert wird durch None
. Der Bestellwert muss mithilfe von sp_settriggerorder
. zurückgesetzt werden.
Wenn derselbe Trigger für mehrere Anweisungstypen als erste oder letzte Reihenfolge festgelegt werden muss, sp_settriggerorder
muss für jeden Anweisungstyp ausgeführt werden. Außerdem muss der Trigger zuerst für einen Anweisungstyp definiert werden, bevor er als First
Last
auslösenden Trigger für diesen Anweisungstyp festgelegt werden kann.
Berechtigungen
Das Festlegen der Reihenfolge eines DDL-Triggers mit Serverbereich (erstellt ON ALL SERVER
) oder einem Anmeldetrigger erfordert CONTROL SERVER
eine Berechtigung.
Das Festlegen der Reihenfolge eines DDL-Triggers mit Datenbankbereich (erstellt ON DATABASE
) erfordert ALTER ANY DATABASE DDL TRIGGER
eine Berechtigung.
Das Festlegen der Reihenfolge eines DML-Triggers erfordert ALTER
die Berechtigung für die Tabelle oder Ansicht, für die der Trigger definiert ist.
Beispiele
A. Festlegen der Schießreihenfolge für einen DML-Trigger
Im folgenden Beispiel wird angegeben, dass trigger der erste Auslöser uSalesOrderHeader
ist, der ausgelöst wird, nachdem ein UPDATE
Vorgang in der Sales.SalesOrderHeader
Tabelle erfolgt.
USE AdventureWorks2022;
GO
EXEC sp_settriggerorder @triggername = 'Sales.uSalesOrderHeader',
@order = 'First',
@stmttype = 'UPDATE';
B. Festlegen der Schießreihenfolge für einen DDL-Trigger
Im folgenden Beispiel wird angegeben, dass trigger der erste Auslöser ddlDatabaseTriggerLog
ist, der ausgelöst wird, nachdem ein ALTER_TABLE
Ereignis in der AdventureWorks2022
Datenbank auftritt.
USE AdventureWorks2022;
GO
EXEC sp_settriggerorder @triggername = 'ddlDatabaseTriggerLog',
@order = 'First',
@stmttype = 'ALTER_TABLE',
@namespace = 'DATABASE';