Udostępnij za pomocą


sp_settriggerorder (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBaza danych SQL w usłudze Microsoft Fabric

Określa, które AFTER spusty są uruchamiane najpierw lub ostatnie. Wyzwalacze AFTER uruchamiane pomiędzy pierwszym a ostatnim są wykonywane w nieokreślonej kolejności.

Transact-SQL konwencje składni

Składnia

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

Arguments

[ @triggername = ] N'triggername'

Nazwa wyzwalacza oraz schemat, do którego należy, jeśli ma to zastosowanie, których kolejność ma być ustalana lub zmieniona. @triggername to nvarchar(517), bez domyślnego wzoru, i jest w formacie [ trigger_schema . ] trigger_name. Jeśli nazwa nie odpowiada wyzwalaczowi lub jeśli nazwa odpowiada wyzwalaczowi INSTEAD OF , procedura zwraca błąd. Schemat nie może być określony dla wyzwalaczy DDL ani logowania.

[ @order = ] 'porządek'

Ustawienie dla nowego porządku wyzwalacza. @order to varchar(10) i może mieć dowolną z następujących wartości.

Wartość Description
First Spust jest wystrzeliwany pierwszy.
Last Spust jest wystrzeliwany na końcu.
None Spust jest uruchamiany w nieokreślonej kolejności.

Ważne

Triggery First i Last muszą być dwoma różnymi wyzwalaczami.

[ @stmttype = ] 'stmttype'

Określa zdanie Transact-SQL, które uruchamia wyzwalacz. @stmttype to varchar(50) i może być , INSERTUPDATE, DELETE, LOGON, lub dowolnym zdarzeniem wydania T-SQL wymienionym w zdarzeniach DDL. Nie można określić grup zdarzeń.

Wyzwalacz może być wyznaczony jako First wyzwalacz lub Last dla typu instrukcji dopiero po zdefiniowaniu tego wyzwalacza jako wyzwalacza dla tego typu instrukcji. Na przykład wyzwalacz TR1 może być wyznaczony First dla INSERT na tabeli T1 , jeśli TR1 jest zdefiniowany jako wyzwalacz INSERT . Silnik bazy danych zwraca błąd, jeśli TR1, który był zdefiniowany tylko jako wyzwalacz INSERT , jest ustawiony jako First wyzwalacz lub Last dla UPDATE instrukcji. Aby uzyskać więcej informacji, zobacz sekcję Uwagi.

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

Gdy @triggername jest wyzwalaczem DDL, @namespace określa, czy @triggername został utworzony w zakresie bazy danych czy serwera. Jeśli @triggername jest wyzwalaczem logowania, musi być to określone. SERVER Więcej informacji o lunecie spustu DDL można znaleźć w artykule DDL Triggers. Jeśli nie jest określone, lub jeśli NULL jest, @triggername jest wyzwalaczem DML.

Zwracanie wartości kodu

0 (sukces) i 1 (porażka).

Uwagi

Ta sekcja omawia kwestie dotyczące wyzwalaczy języka manipulacji danymi (DML) oraz języka definicji danych (DDL).

Wyzwalacze DML

Na jednej tabeli może być tylko jeden First i jeden Last wyzwalacz dla każdego zawołania.

Jeśli wyzwalacz First jest już zdefiniowany w tabeli, bazie danych lub serwerze, nie możesz wyznaczyć nowego wyzwalacza dla First tej samej tabeli, bazy danych lub serwera dla tej samej @stmttype. To ograniczenie dotyczy Last także wyzwalaczy.

Replikacja automatycznie generuje pierwszy wyzwalacz dla każdej tabeli uwzględnionej w subskrypcji natychmiastowej aktualizacji lub kolejkowej aktualizacji. Replikacja wymaga, aby jej wyzwalacz był pierwszym wyzwalaczem. Replikacja powoduje błąd, gdy próbujesz uwzględnić tabelę z pierwszym wyzwalaczem w subskrypcji natychmiastowej aktualizacji lub kolejkowej aktualizacji. Jeśli spróbujesz ustawić wyzwalacz jako pierwszy wyzwalacz po dołączeniu tabeli do subskrypcji, sp_settriggerorder pojawia się błąd. Jeśli używasz ALTER TRIGGER na wyzwalaczu replikacji lub sp_settriggerorder zmieniasz wyzwalacz replikacji na Last a None , subskrypcja nie działa poprawnie.

Wyzwalacze DDL

Jeśli na tym samym zdarzeniu istnieją wyzwalacz DDL o zakresie bazy danych i DDL o zakresie serwera, możesz określić, że oba wyzwalacze będą First wyzwalaczem lub wyzwalaczem Last . Jednak wyzwalacze z zakresu serwera zawsze uruchamiają się jako pierwsze. Ogólnie rzecz biorąc, kolejność wykonywania wyzwalaczy DDL istniejących na tym samym zdarzeniu jest następująca:

  1. Wyzwalacz na poziomie serwera oznaczony First
  2. Inne wyzwalacze na poziomie serwera
  3. Wyzwalacz na poziomie serwera oznaczony Last
  4. Wyzwalacz na poziomie bazy danych oznaczony First
  5. Inne wyzwalacze na poziomie bazy danych
  6. Wyzwalacz na poziomie bazy danych oznaczony Last

Ogólne zagadnienia dotyczące wyzwalacza

Jeśli ALTER TRIGGER zdanie zmienia pierwszy lub ostatni wyzwalacz, First atrybut or Last pierwotnie ustawiony na wyzwalaczu zostaje usunięty, a wartość zastąpiona przez None. Wartość porządku należy zresetować za pomocą sp_settriggerorder.

Jeśli ten sam wyzwalacz musi być wyznaczony jako pierwsze lub ostatnie zamówienie dla więcej niż jednego typu instrukcji, sp_settriggerorder musi być wykonany dla każdego typu instrukcji. Ponadto wyzwalacz musi być najpierw zdefiniowany dla typu instrukcji, zanim można go wyznaczyć jako First wyzwalacz lub Last do wywołania dla tego typu instrukcji.

Permissions

Ustawienie kolejności wyzwalacza DDL z zakresem serwera (utworzonym ON ALL SERVER) lub wyzwalaczem logowania wymaga CONTROL SERVER uprawnień.

Ustawienie kolejności wyzwalacza DDL z zakresem bazy danych (utworzonym ON DATABASE) wymaga ALTER ANY DATABASE DDL TRIGGER uprawnień.

Ustawienie kolejności wyzwalacza DML wymaga ALTER uprawnień do tabeli lub widoku, na którym wyzwalacz jest zdefiniowany.

Przykłady

A. Ustaw kolejność wystrzału dla wyzwalacza DML

Poniższy przykład określa, że trigger uSalesOrderHeader jest pierwszym wyzwalaczem uruchamianym po wykonaniu operacji UPDATE na tabeli Sales.SalesOrderHeader .

USE AdventureWorks2022;
GO

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

B. Ustaw kolejność strzału dla spustu DDL

Poniższy przykład określa, że wyzwalacz ddlDatabaseTriggerLog jest pierwszym wyzwalaczem uruchamianym po ALTER_TABLE zdarzeniu w bazie AdventureWorks2025 danych.

USE AdventureWorks2022;
GO

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