Condividi tramite


sp_settriggerorder (Transact-SQL)

Si applica a: SQL Server database SQL di Azure Istanza gestita di SQL di Azure

Specifica i AFTER trigger attivati per primo o per ultimo. I AFTER trigger attivati tra il primo e l'ultimo trigger vengono eseguiti in ordine non definito.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

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

Argomenti

[ @triggername = ] N'triggername'

Nome del trigger e dello schema a cui appartiene, se applicabile, il cui ordine deve essere impostato o modificato. @triggername è nvarchar(517), senza impostazione predefinita ed è nel formato [ trigger_schema . ] trigger_name. Se il nome non corrisponde a un trigger o se il nome corrisponde a un INSTEAD OF trigger, la routine restituisce un errore. Non è possibile specificare uno schema per i trigger DDL o di accesso.

[ @order = ] 'order'

Impostazione per il nuovo ordine del trigger. @order è varchar(10)e può essere uno dei valori seguenti.

Valore Descrizione
First Trigger avviato per primo.
Last Trigger avviato per ultimo.
None Il trigger viene attivato in base a un ordine non definito.

Importante

I First trigger e Last devono essere due trigger diversi.

[ @stmttype = ] 'stmttype'

Specifica l'istruzione Transact-SQL che attiva il trigger. @stmttype è varchar(50) e può essere INSERT, , DELETEUPDATE, LOGON, o qualsiasi evento di istruzione T-SQL elencato in Eventi DDL. Non è possibile specificare gruppi di eventi.

Un trigger può essere designato come First trigger o Last per un tipo di istruzione solo dopo che tale trigger è stato definito come trigger per tale tipo di istruzione. Ad esempio, il trigger TR1 può essere designato First per INSERT nella tabella T1 se TR1 è definito come INSERT trigger. Il motore di database restituisce un errore se TR1, definito solo come INSERT trigger, viene impostato come First trigger o Last per un'istruzione UPDATE . Per altre informazioni, vedere la sezione Osservazioni.

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

Quando @triggername è un trigger DDL, @namespace specifica se @triggername è stato creato con ambito di database o ambito del server. Se @triggername è un trigger di accesso, SERVER deve essere specificato. Per altre informazioni sull'ambito del trigger DDL, vedere Trigger DDL. Se non specificato o se NULL viene specificato, @triggername è un trigger DML.

Valori del codice restituito

0 (esito positivo) e 1 (errore).

Osservazioni:

Questa sezione illustra le considerazioni relative ai trigger DML (Data Manipulation Language) e DDL (Data Definition Language).

Trigger DML

Può essere presente un First solo trigger e un Last trigger per ogni istruzione in una singola tabella.

Se un First trigger è già definito nella tabella, nel database o nel server, non è possibile designare un nuovo trigger per First la stessa tabella, database o server per lo stesso @stmttype. Questa restrizione applica Last anche i trigger.

La replica genera automaticamente un primo trigger per ogni tabella inclusa in una sottoscrizione ad aggiornamento in coda o ad aggiornamento immediato. La replica richiede che il trigger sia il primo trigger. La replica genera un errore se si cerca di includere una tabella con un primo trigger in una sottoscrizione ad aggiornamento immediato o ad aggiornamento in coda. Se si tenta di creare un trigger un primo trigger dopo che una tabella è inclusa in una sottoscrizione, sp_settriggerorder restituisce un errore. Se si usa ALTER TRIGGER nel trigger di replica o si usa sp_settriggerorder per modificare il trigger di replica in un Last trigger o None , la sottoscrizione non funziona correttamente.

Trigger DDL

Se un trigger DDL con ambito di database e un trigger DDL con ambito server esistono nello stesso evento, è possibile specificare che entrambi i trigger siano un First trigger o un Last trigger. Tuttavia, i trigger con ambito server vengono sempre generati per primi. In generale, l'ordine di esecuzione dei trigger DDL che esistono sullo stesso evento è il seguente:

  1. Trigger a livello di server contrassegnato First
  2. Altri trigger a livello di server
  3. Trigger a livello di server contrassegnato Last
  4. Trigger a livello di database contrassegnato First
  5. Altri trigger a livello di database
  6. Trigger a livello di database contrassegnato Last

Considerazioni generali sul trigger

Se un'istruzione ALTER TRIGGER modifica un primo o l'ultimo trigger, l'attributo First o Last impostato originariamente nel trigger viene eliminato e il valore viene sostituito da None. Il valore dell'ordine deve essere reimpostato tramite sp_settriggerorder.

Se lo stesso trigger deve essere designato come primo o ultimo ordine per più di un tipo di istruzione, sp_settriggerorder deve essere eseguito per ogni tipo di istruzione. Inoltre, il trigger deve essere definito per un tipo di istruzione prima di poter essere designato come First trigger o Last per attivare tale tipo di istruzione.

Autorizzazioni

L'impostazione dell'ordine di un trigger DDL con ambito server (creato ON ALL SERVER) o un trigger di accesso richiede CONTROL SERVER l'autorizzazione.

L'impostazione dell'ordine di un trigger DDL con ambito database (creato ON DATABASE) richiede ALTER ANY DATABASE DDL TRIGGER l'autorizzazione.

L'impostazione dell'ordine di un trigger DML richiede ALTER l'autorizzazione per la tabella o la vista in cui è definito il trigger.

Esempi

R. Impostare l'ordine di attivazione per un trigger DML

Nell'esempio seguente viene specificato che il trigger è il primo trigger uSalesOrderHeader da attivare dopo che si verifica un'operazione UPDATE nella Sales.SalesOrderHeader tabella.

USE AdventureWorks2022;
GO

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

B. Impostare l'ordine di attivazione per un trigger DDL

Nell'esempio seguente viene specificato che il trigger è il primo trigger ddlDatabaseTriggerLog da attivare dopo che si verifica un ALTER_TABLE evento nel AdventureWorks2022 database.

USE AdventureWorks2022;
GO

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