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
, , DELETE
UPDATE
, 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:
- Trigger a livello di server contrassegnato
First
- Altri trigger a livello di server
- Trigger a livello di server contrassegnato
Last
- Trigger a livello di database contrassegnato
First
- Altri trigger a livello di database
- 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';