Freigeben über


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 seinLOGONUPDATEINSERTDELETE. 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 TR1nur 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:

  1. Der trigger auf Serverebene markiert First
  2. Andere Trigger auf Serverebene
  3. Der trigger auf Serverebene markiert Last
  4. Der trigger auf Datenbankebene markiert First
  5. Andere Trigger auf Datenbankebene
  6. 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';