sp_settriggerorder (Transact-SQL)

Specifica il primo o l'ultimo trigger AFTER attivato. Gli altri trigger AFTER vengono attivati in base a un ordine non definito.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

sp_settriggerorder [ @triggername = ] '[ triggerschema. ] triggername' 
        , [ @order = ] 'value' 
        , [ @stmttype = ] 'statement_type' 
        [ , [ @namespace = ] { 'DATABASE' | 'SERVER' | NULL } ]

Argomenti

  • [ @triggername= ] '[ triggerschema**.] triggername'**
    Nome del trigger e schema al quale appartiene, se applicabile, il cui ordine deve essere impostato o modificato. [triggerschema**.**]triggername è di tipo sysname. Se il nome specificato non corrisponde a un trigger oppure corrisponde a un trigger INSTEAD OF, viene restituito un errore. Non è possibile specificare triggerschema per i trigger DDL o LOGON.

  • [ @order= ] 'value'
    Impostazione del nuovo ordine del trigger. value è di tipo varchar(10). I possibili valori sono i seguenti.

    Nota importanteImportante

    I trigger First e Last devono essere due trigger distinti.

    Valore

    Descrizione

    First

    Trigger avviato per primo.

    Last

    Trigger avviato per ultimo.

    None

    Il trigger viene attivato in base a un ordine non definito.

  • [ @stmttype= ] 'statement_type'
    Specifica l'istruzione SQL che attiva il trigger. statement_type è di tipo varchar(50) e i possibili valori sono INSERT, UPDATE, DELETE, LOGON oppure qualsiasi evento dell'istruzione Transact-SQL elencato in Eventi DDL. Non è possibile specificare gruppi di eventi.

    È possibile designare un trigger come First o Last per un tipo di istruzione solo dopo che è stato definito come trigger per tale tipo di istruzione. Il trigger TR1, ad esempio, può essere designato come First per l'istruzione INSERT eseguita nella tabella T1 se TR1 è definito come trigger INSERT. Motore di database restituisce un errore se TR1, che è stato definito solo come trigger INSERT, viene impostato come trigger First o Last per un'istruzione UPDATE. Per ulteriori informazioni, vedere la sezione Osservazioni.

  • @namespace= { 'DATABASE' | 'SERVER' | NULL }
    Se triggername è un trigger DDL, specifica se triggername è stato creato con ambito database o ambito server. Se triggername è un trigger LOGON, è necessario specificare SERVER. Per ulteriori informazioni sull'ambito dei trigger DDL, vedere Progettazione di trigger DDL. Se omesso oppure se si specifica NULL, triggername è un trigger DML.

Valori restituiti

0 (esito positivo) o 1 (esito negativo)

Osservazioni

Trigger DML

Per ogni istruzione in una tabella specifica possono essere presenti solo un trigger First e un trigger Last.

Se nella tabella, nel database o nel server è già stato definito un trigger First, non è possibile definire un nuovo trigger First per la stessa tabella, lo stesso database o lo stesso server per lo stesso argomento statement_type. Questa limitazione vale anche per i trigger Last.

La replica genera automaticamente il primo trigger per qualsiasi tabella inclusa in una sottoscrizione ad aggiornamento immediato o ad aggiornamento in coda. La replica richiede che il proprio 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 cerca di impostare un trigger come primo trigger dopo l'inclusione di una tabella in una sottoscrizione, la stored procedure sp_settriggerorder restituisce un errore. Se si utilizza l'istruzione ALTER TRIGGER nel trigger di replica oppure si utilizza la stored procedure sp_settriggerorder per modificare il trigger di replica in un trigger di tipo Last o None, la sottoscrizione non funziona correttamente.

Trigger DDL

Se un trigger DDL con ambito del database e un trigger DDL con ambito server esistono nello stesso evento, è possibile specificare che entrambi i trigger sono un primo trigger o un ultimo 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 del server contrassegnato come primo.

  2. Altri trigger a livello del server

  3. Trigger a livello del server contrassegnato come ultimo.

  4. Trigger a livello del database contrassegnato come primo.

  5. Altri trigger a livello del database

  6. Trigger a livello del database contrassegnato come ultimo.

Considerazioni generali sui trigger

Se tramite un'istruzione ALTER TRIGGER viene modificato un trigger designato come First o Last, l'attributo First o Last impostato inizialmente nel trigger viene sostituito con None. Il valore dell'ordine di esecuzione deve essere reimpostato tramite sp_settriggerorder.

Se uno stesso trigger deve essere designato come trigger First o Last per più tipi di istruzione, è necessario eseguire sp_settriggerorder per ogni tipo di istruzione. Inoltre, per poter designare un trigger come First o Last per un determinato tipo di istruzione, è prima necessario definirlo per tale tipo di istruzione.

Autorizzazioni

Per impostare l'ordine di un trigger DDL con ambito server (creato ON ALL SERVER) o un trigger LOGON è necessaria l'autorizzazione CONTROL SERVER nel server.

Per impostare l'ordine di attivazione di un trigger DDL nell'ambito del database (creato tramite l'istruzione ON DATABASE), è necessario disporre dell'autorizzazione ALTER ANY DATABASE DDL TRIGGER.

Per impostare l'ordine di attivazione di un trigger DML, è necessario disporre dell'autorizzazione ALTER per la tabella o vista in cui è stato definito il trigger.

Esempi

A. Impostazione dell'ordine di attivazione per un trigger DML

Nell'esempio seguente il trigger uSalesOrderHeader viene definito come primo trigger da attivare dopo l'esecuzione di un'operazione UPDATE nella tabella Sales.SalesOrderHeader.

USE AdventureWorks;
GO
sp_settriggerorder @triggername= 'Sales.uSalesOrderHeader', @order='First', @stmttype = 'UPDATE';

B. Impostazione dell'ordine di attivazione per un trigger DDL

Nell'esempio seguente il trigger ddlDatabaseTriggerLog viene definito come primo trigger da attivare dopo che si è verificato un evento ALTER_TABLE nel database AdventureWorks.

USE AdventureWorks;
GO
sp_settriggerorder @triggername= 'ddlDatabaseTriggerLog', @order='First', @stmttype = 'ALTER_TABLE', @namespace = 'DATABASE';