(0) exportieren Drucken
Alle erweitern
Erweitern Minimieren
Dieser Artikel wurde manuell übersetzt. Bewegen Sie den Mauszeiger über die Sätze im Artikel, um den Originaltext anzuzeigen. Weitere Informationen
Übersetzung
Original

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.

Gilt für: SQL Server (SQL Server 2008 bis aktuelle Version), Windows Azure SQL-Datenbank (Ursprüngliche Version bis aktuelle Version).

Themenlink (Symbol) Transact-SQL-Syntaxkonventionen

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

[ @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 der Name dem INSTEAD OF-Trigger entspricht, gibt die Prozedur einen Fehler zurück. triggerschema kann für DDL- oder LOGON-Trigger nicht angegeben werden.

[ @order= ] 'value'

Die Einstellung für die neue Reihenfolge des Triggers. value ist vom Datentyp varchar(10). Die folgenden Werte sind möglich:

Wichtiger Hinweis 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

None

Trigger wird in nicht definierter Reihenfolge ausgelöst

[ @stmttype= ] 'statement_type'

Gibt die SQL-Anweisung an, die den Trigger auslöst. statement_type ist vom Datentyp varchar(50) und kann ein INSERT-, UPDATE-, DELETE-, LOGON-Ereignis oder ein beliebiges Transact-SQL-Anweisungsereignis sein, das in DDL-Ereignisse aufgelistet 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 @namespace 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 DDL-Trigger. Wenn das Argument nicht angegeben oder wenn NULL angegeben ist, ist triggername ein DML-Trigger.

SERVER gilt für: SQL Server 2008 bis SQL Server 2014.

0 (Erfolg) oder 1 (Fehler)

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 Abonnement mit sofortigem Update oder mit verzögertem Update über eine Warteschlange 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 Abonnement mit sofortigem Update bzw. verzögertem Update über eine Warteschlange 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.

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.

A.Festlegen der Auslösungsreihenfolge 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 AdventureWorks2012;
GO
sp_settriggerorder @triggername= 'Sales.uSalesOrderHeader', @order='First', @stmttype = 'UPDATE';

B.Festlegen der Auslösungsreihenfolge 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 AdventureWorks2012 -Datenbank ausgelöst wird.

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

Community-Beiträge

HINZUFÜGEN
Anzeigen:
© 2014 Microsoft