sp_settriggerorder (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-databas i Microsoft Fabric

Specificerar vilka AFTER avtryckare som avfyras först eller sist. De AFTER triggers som avfyras mellan den första och sista triggern utförs i odefinierad ordning.

Transact-SQL syntaxkonventioner

Syntax

sp_settriggerorder
    [ @triggername = ] N'triggername'
    , [ @order = ] 'order'
    , [ @stmttype = ] 'stmttype'
    [ , [ @namespace = ] 'DATABASE' | 'SERVER' | NULL ]
[ ; ]

Arguments

[ @triggername = ] N'triggername'

Namnet på triggern och schemat den tillhör, om tillämpligt, vars ordning ska sättas eller ändras. @triggername är nvarchar(517), utan standard, och har formatet [ trigger_schema ] trigger_name. Om namnet inte motsvarar en trigger eller om namnet motsvarar en INSTEAD OF trigger, returnerar proceduren ett fel. Ett schema kan inte specificeras för DDL- eller inloggningstriggers.

[ @order = ] 'ordning'

Inställningen för den nya ordningen på triggern. @order är varchar(10) och kan vara något av följande värden.

Värde Description
First Avtryckaren avfyras först.
Last Avtryckaren avfyras sist.
None Avtryckaren avfyras i obestämd ordning.

Viktigt!

Och FirstLast utlösarna måste vara två olika utlösare.

[ @stmttype = ] 'stmttype'

Specificerar det Transact-SQL uttalande som utlöser avtryckaren. @stmttype är varchar(50) och kan vara INSERT, UPDATE, DELETE, , LOGONeller vilken T-SQL-satshändelse som helst som listas i DDL-händelser. Händelsegrupper kan inte specificeras.

En trigger kan betecknas som ELLER-trigger FirstLast för en statementtyp först efter att den triggern definierats som en trigger för den statementtypen. Till exempel kan trigger TR1 anges First för INSERT på tabellen T1 om TR1 definieras som en INSERT trigger. Databasmotorn returnerar ett fel om TR1, som endast definierades som en INSERT trigger, är satt som en First eller Last trigger för en UPDATE sats. Mer information finns i avsnittet Kommentarer.

@namespace = { 'DATABAS' | 'SERVER' | NULL }

När @triggername är en DDL-trigger specificerar @namespace om @triggername skapades med databasomfång eller serveromfång. Om @triggername är en inloggningsutlösare SERVER måste den specificeras. För mer information om DDL-triggerscope, se DDL Triggers. Om det inte specificeras, eller om NULL det är specificerat, är @triggername en DML-trigger.

Returnera kodvärden

0 (framgång) och 1 (misslyckande).

Anmärkningar

Detta avsnitt diskuterar överväganden för data manipulationsspråk (DML) och datadefinitionsspråk (DDL)-triggers.

DML-utlösare

Det kan bara finnas en First och en Last trigger för varje påstående i en enda tabell.

Om en First trigger redan är definierad på tabellen, databasen eller servern kan du inte utse en ny trigger som First för samma tabell, databas eller server för samma @stmttype. Denna begränsning gäller Last även triggers.

Replikering genererar automatiskt en första trigger för varje tabell som ingår i en prenumeration på omedelbar uppdatering eller köad uppdatering. Replikation kräver att dess utlösare är den första utlösaren. Replikering ger ett fel när du försöker inkludera en tabell med en första trigger i en prenumeration på omedelbar uppdatering eller kö. Om du försöker göra en trigger till en första trigger efter att en tabell inkluderats i en prenumeration, sp_settriggerorder returneras ett fel. Om du använder ALTER TRIGGER på replikationstriggern, eller använder sp_settriggerorder för att ändra replikationstriggern till en Last eller None trigger, fungerar prenumerationen inte korrekt.

DDL-utlösare

Om en DDL-trigger med databasomfång och en DDL-utlösare med serveromfång finns på samma händelse, kan du specificera att båda utlösarna ska vara en First utlösare eller en Last utlösare. Server-scoped triggers aktiveras dock alltid först. Generellt sett är exekveringsordningen för DDL-triggers som finns på samma händelse följande:

  1. Servernivå-triggern markerad First
  2. Andra servernivå-triggers
  3. Servernivå-triggern markerad Last
  4. Databasnivå-triggern markerad First
  5. Andra databasnivå-triggers
  6. Databasnivå-triggern markerad Last

Allmänna överväganden för utlösare

Om en ALTER TRIGGER sats ändrar en första eller sista trigger tas or-attributet FirstLast som ursprungligen sattes på triggern bort, och värdet ersätts med None. Ordervärdet måste återställas genom att använda sp_settriggerorder.

Om samma trigger måste anges som första eller sista order för mer än en satstyp måste sp_settriggerorder den köras för varje satstyp. Dessutom måste triggern först definieras för en statementtyp innan den kan utses som trigger First för Last den statementtypen.

Permissions

Att ställa in ordningen på en DDL-trigger med serveromfängd (skapad ON ALL SERVER) eller en inloggningsutlösare kräver CONTROL SERVER behörighet.

Att ställa in ordningen på en DDL-trigger med databasens omfattning (skapad ON DATABASE) kräver ALTER ANY DATABASE DDL TRIGGER behörighet.

Att ställa in ordningen på en DML-trigger kräver ALTER behörighet i tabellen eller vyn där triggern är definierad.

Examples

A. Ställ in avfyrningsordningen för en DML-avtryckare

Följande exempel specificerar att triggern uSalesOrderHeader är den första triggern som avfyras efter att en UPDATE operation har utförts på tabellen Sales.SalesOrderHeader .

USE AdventureWorks2022;
GO

EXECUTE sp_settriggerorder
    @triggername = 'Sales.uSalesOrderHeader',
    @order = 'First',
    @stmttype = 'UPDATE';

B. Ställ in avfyrningsordningen för en DDL-avtryckare

Följande exempel specificerar att triggern ddlDatabaseTriggerLog är den första triggern som utlöses efter att en ALTER_TABLE händelse inträffat i databasen AdventureWorks2025 .

USE AdventureWorks2022;
GO

EXECUTE sp_settriggerorder
    @triggername = 'ddlDatabaseTriggerLog',
    @order = 'First',
    @stmttype = 'ALTER_TABLE',
    @namespace = 'DATABASE';