Delen via


sp_settriggerorder (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-database in Microsoft Fabric

Specificeert welke AFTER triggers eerst of als laatste worden afgevuurd. De AFTER triggers die tussen de eerste en laatste trigger worden afgevuurd, worden uitgevoerd in onbepaalde volgorde.

Transact-SQL syntaxis-conventies

Syntaxis

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

Arguments

[ @triggername = ] N'triggername'

De naam van de trigger en het schema waartoe deze behoort, indien van toepassing, waarvan de volgorde moet worden ingesteld of gewijzigd. @triggername is nvarchar(517), zonder standaard, en is in het formaat [ trigger_schema . ] trigger_name. Als de naam niet overeenkomt met een trigger of als de naam overeenkomt met een INSTEAD OF trigger, geeft de procedure een foutmelding terug. Een schema kan niet worden gespecificeerd voor DDL- of logontriggers.

[ @order = ] 'orde'

De instelling voor de nieuwe volgorde van de trigger. @order is varchar(10) en kan een van de volgende waarden zijn.

Waarde Description
First De trekker wordt als eerste afgevuurd.
Last De trekker wordt als laatste afgevuurd.
None De trekker wordt in onbepaalde volgorde afgevuurd.

Belangrijk

De First en Last triggers moeten twee verschillende triggers zijn.

[ @stmttype = ] 'stmttype'

Specificeert de Transact-SQL verklaring die de trekker afvuurt. @stmttype is varchar(50) en kan INSERT, UPDATE, DELETE, , LOGONof elk T-SQL-statementevent zijn dat in DDL-events wordt vermeld. Gebeurtenisgroepen kunnen niet worden gespecificeerd.

Een trigger kan pas als de First of Last trigger voor een statementtype worden aangewezen nadat die trigger als trigger voor dat statementtype is gedefinieerd. Bijvoorbeeld, trigger TR1 kan worden aangewezen First voor INSERT op table T1 als TR1 gedefinieerd is als een INSERT trigger. De Database Engine geeft een foutmelding als TR1, die alleen als trigger INSERT werd gedefinieerd, wordt ingesteld als een First of Last trigger voor een UPDATE instructie. Zie de sectie Opmerkingen voor meer informatie.

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

Wanneer @triggername een DDL-trigger is, specificeert @namespace of @triggername is gemaakt met databasescope of serverscope. Als @triggername een logon-trigger is, SERVER moet worden gespecificeerd. Voor meer informatie over DDL-triggerscope, zie DDL Triggers. Als dat niet is gespecificeerd, of als NULL dat wel zo is, is @triggername een DML-trigger.

Codewaarden retourneren

0 (succes) en 1 (mislukking).

Opmerkingen

Deze sectie bespreekt overwegingen voor data manipulation language (DML) en data definition language (DDL) triggers.

DML-triggers

Er kan slechts één First en één Last trigger zijn voor elke statement in één enkele tabel.

Als er al een First trigger is gedefinieerd op de tabel, database of server, kun je geen nieuwe trigger aanwijzen voor First dezelfde tabel, database of server voor dezelfde @stmttype. Deze beperking geldt ook voor Last triggers.

Replicatie genereert automatisch een eerste trigger voor elke tabel die is opgenomen in een direct update- of queue-update-abonnement. Replicatie vereist dat de trigger de eerste trigger is. Replicatie geeft een foutmelding wanneer je probeert een tabel met een eerste trigger toe te voegen in een direct update- of queue-update-abonnement. Als je probeert een trigger als eerste trigger te maken nadat een tabel in een abonnement is opgenomen, sp_settriggerorder krijg je een foutmelding. Als je ALTER TRIGGER het gebruikt op de replicatietrigger, of gebruikt sp_settriggerorder om de replicatietrigger te veranderen in een Last or-trigger None , werkt het abonnement niet correct.

DDL-triggers

Als er een DDL-trigger met databasescope en een DDL-trigger met serverscope op hetzelfde event bestaan, kun je specificeren dat beide triggers een First trigger of een Last trigger zijn. Server-scoped triggers worden echter altijd eerst geactiveerd. In het algemeen is de volgorde van uitvoering van DDL-triggers die op hetzelfde evenement bestaan als volgt:

  1. De server-level trigger is gemarkeerd First
  2. Andere server-level triggers
  3. De server-level trigger is gemarkeerd Last
  4. De database-niveau trigger is gemarkeerd First
  5. Andere database-niveau triggers
  6. De database-niveau trigger is gemarkeerd Last

Algemene triggeroverwegingen

Als een ALTER TRIGGER statement een eerste of laatste trigger verandert, wordt het First oorspronkelijk ingestelde attribuut Last of verwijderd en wordt de waarde vervangen door None. De orderwaarde moet worden gereset door gebruik te maken van sp_settriggerorder.

Als dezelfde trigger als eerste of laatste order voor meer dan één statementtype moet worden aangewezen, sp_settriggerorder moet voor elk statementtype worden uitgevoerd. Ook moet de trigger eerst worden gedefinieerd voor een statementtype voordat deze kan worden aangewezen als de First of Last trigger die voor dat statementtype moet worden afgevuurd.

Permissions

Het instellen van de volgorde van een DDL-trigger met serverscope (aangemaakt ON ALL SERVER) of een logon-trigger vereist CONTROL SERVER een toestemming.

Het instellen van de volgorde van een DDL-trigger met databasescope (gecreëerd ON DATABASE) vereist ALTER ANY DATABASE DDL TRIGGER een toestemming.

Het instellen van de volgorde van een DML-trigger vereist ALTER toestemming voor de tabel of weergave waarop de trigger is gedefinieerd.

Voorbeelden

Eén. Stel de vuurvolgorde in voor een DML-trekker

Het volgende voorbeeld specificeert dat de trigger uSalesOrderHeader de eerste trigger is die wordt afgegaan nadat een UPDATE bewerking op de Sales.SalesOrderHeader tafel heeft plaatsgevonden.

USE AdventureWorks2022;
GO

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

B. Stel de vuurvolgorde in voor een DDL-trekker

Het volgende voorbeeld specificeert dat de trigger ddlDatabaseTriggerLog de eerste trigger is die wordt geactiveerd nadat een ALTER_TABLE gebeurtenis in de AdventureWorks2025 database plaatsvindt.

USE AdventureWorks2022;
GO

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