Condividi tramite


ALTER TRIGGER (Transact-SQL)

Modifica la definizione di un trigger DML, DDL o LOGON precedentemente creato dall'istruzione CREATE TRIGGER. I trigger vengono creati tramite l'istruzione CREATE TRIGGER. Possono essere creati direttamente dalle istruzioni Transact-SQL o dai metodi di assembly creati in Microsoft.NET Framework Common Language Runtime (CLR) e caricati in un'istanza di SQL Server. Per ulteriori informazioni sui parametri utilizzati nell'istruzione ALTER TRIGGER, vedere CREATE TRIGGER (Transact-SQL).

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger)
ALTER TRIGGER schema_name.trigger_name 
ON ( table | view ) 
[ WITH <dml_trigger_option> [ ,...n ] ]
(FOR | AFTER | INSTEAD OF ) 
{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] } 
[ NOT FOR REPLICATION ] 
AS { sql_statement [ ; ] [ ...n ] | EXTERNAL NAME <method specifier> [ ; ] } 

<dml_trigger_option> ::=
    [ ENCRYPTION ]
    [ <EXECUTE AS Clause> ]

<method_specifier> ::=
        assembly_name.class_name.method_name

Trigger on a CREATE, ALTER, DROP, GRANT, DENY, REVOKE, or UPDATE statement (DDL Trigger)

ALTER TRIGGER trigger_name 
ON { DATABASE | ALL SERVER } 
[ WITH <ddl_trigger_option> [ ,...n ] ]
{ FOR | AFTER } { event_type [ ,...n ] | event_group } 

AS { sql_statement [ ; ] | EXTERNAL NAME <method specifier> 
[ ; ] }
} 

<ddl_trigger_option> ::=
    [ ENCRYPTION ]
    [ <EXECUTE AS Clause> ]

<method_specifier> ::=
        assembly_name.class_name.method_name

Trigger on a LOGON event (Logon Trigger)
ALTER TRIGGER trigger_name 
ON ALL SERVER 
[ WITH <logon_trigger_option> [ ,...n ] ]
{ FOR| AFTER } LOGON 
AS { sql_statement  [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier >  [ ; ] }

<logon_trigger_option> ::=
    [ ENCRYPTION ]
    [ EXECUTE AS Clause ]

<method_specifier> ::=
    assembly_name.class_name.method_name

Argomenti

  • schema_name
    Nome dello schema a cui appartiene un trigger DML. I trigger DML sono definiti a livello di ambito di schema della tabella o della vista in cui vengono creati. schema_name è facoltativo solo se il trigger DML e la tabella o la vista corrispondente appartengono allo schema predefinito. Per i trigger DDL o LOGON non è possibile specificare schema_name.

  • trigger_name
    Trigger esistente da modificare.

  • table | view
    Tabella o vista nella quale viene eseguito il trigger DML. Il nome completo della tabella o vista è facoltativo.

  • DATABASE
    Applica l'ambito di un trigger DDL al database corrente. Se viene specificato questo parametro, il trigger viene attivato quando si verifica un tipo di evento specificato in event_type o event_group nel database corrente.

  • ALL SERVER
    Applica l'ambito di un trigger DDL o LOGON al server corrente. Se viene specificato questo parametro, il trigger viene attivato quando si verifica un tipo di evento specificato in event_type o event_group nel server corrente.

  • WITH ENCRYPTION
    Imposta la crittografia delle voci di sys.syscomments sys.sql_modules contenenti il testo dell'istruzione ALTER TRIGGER. Tramite il parametro WITH ENCRYPTION è possibile evitare la pubblicazione del trigger come parte della replica di SQL Server. Non è possibile specificare WITH ENCRYPTION per i trigger CLR.

    [!NOTA]

    Se si crea un trigger tramite WITH ENCRYPTION, occorre specificarlo nuovamente nell'istruzione ALTER TRIGGER affinché questa opzione rimanga attivata.

  • EXECUTE AS
    Specifica il contesto di protezione nel quale viene eseguito il trigger. Consente di controllare l'account utente utilizzato dall'istanza di SQL Server per convalidare le autorizzazioni su ogni oggetto di database a cui fa riferimento il trigger.

    Per ulteriori informazioni, vedere Clausola EXECUTE AS (Transact-SQL).

  • AFTER
    Specifica che il trigger viene attivato solo dopo la corretta esecuzione dell'istruzione di trigger SQL. È inoltre necessario che tutte le operazioni referenziali di propagazione e le verifiche dei vincoli siano state completate correttamente prima che il trigger venga attivato.

    Se viene specificata solo la parola chiave FOR, AFTER è il valore predefinito.

    È possibile definire i trigger AFTER DML solo nelle tabelle.

  • INSTEAD OF
    Specifica che il trigger DML viene eseguito al posto dell'istruzione di trigger SQL. Il trigger risulta pertanto prioritario rispetto alle azioni delle istruzioni di trigger. Non è possibile specificare INSTEAD OF per i trigger DDL o LOGON.

    In una tabella o vista è possibile definire al massimo un trigger INSTEAD OF per ogni istruzione INSERT, UPDATE o DELETE. È tuttavia possibile definire viste che fanno riferimento ad altre viste. Ogni vista include un trigger INSTEAD OF.

    I trigger INSTEAD OF non sono supportati in viste create con la clausola WITH CHECK OPTION. Se un trigger INSTEAD OF viene aggiunto a una vista per la quale è stato specificato WITH CHECK OPTION, SQL Server genera un errore. Per poter definire il trigger INSTEAD OF, è necessario rimuovere l'opzione tramite l'istruzione ALTER VIEW.

  • { [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] } | { [INSERT ] [ , ] [ UPDATE ] }
    Specifica quali istruzioni di modifica dei dati eseguite nella tabella o vista attivano il trigger DML. È necessario specificare almeno un'opzione. Nella definizione di trigger è consentita qualsiasi combinazione delle opzioni nell'ordine desiderato. Se vengono specificate più opzioni, è necessario separarle con una virgola.

    Per i trigger INSTEAD OF, l'opzione DELETE non è consentita in tabelle contenenti una relazione referenziale che specifica un'operazione di propagazione ON DELETE. In modo analogo, l'opzione UPDATE non è consentita in tabelle contenenti una relazione referenziale che specifica un'operazione di propagazione ON UPDATE. Per ulteriori informazioni, vedere ALTER TABLE (Transact-SQL).

  • event_type
    Nome di un evento del linguaggio Transact-SQL che, dopo l'esecuzione, attiva un trigger DDL. Gli eventi supportati dai trigger DDL sono elencati in Eventi DDL.

  • event_group
    Nome di un raggruppamento predefinito di eventi del linguaggio Transact-SQL. Il trigger DDL viene attivato dopo l'esecuzione di qualsiasi evento del linguaggio Transact-SQL appartenente a event_group. I gruppi di eventi supportati dai trigger DDL sono elencati in Gruppi di eventi DDL. Dopo il completamento dell'esecuzione di ALTER TRIGGER, event_group funge anche da macro aggiungendo i relativi tipi di evento che include alla vista del catalogo sys.trigger_events.

  • NOT FOR REPLICATION
    Indica che il trigger non deve essere eseguito quando un agente di replica modifica la tabella coinvolta nel trigger. Per ulteriori informazioni, vedere Controllo di vincoli, identità e trigger con l'opzione NOT FOR REPLICATION.

  • sql_statement
    Condizioni e azioni del trigger.

  • <method_specifier>
    Specifica il metodo di un'assembly da associare al trigger. Il metodo deve restituire void e non deve accettare argomenti. class_name deve essere un identificatore SQL Server valido e deve esistere come classe nell'assembly con visibilità dell'assembly. La classe non può essere nidificata.

Osservazioni

Per ulteriori informazioni sull'istruzione ALTER TRIGGER, vedere la sezione Osservazioni in CREATE TRIGGER (Transact-SQL).

Trigger DML

L'istruzione ALTER TRIGGER supporta viste ad aggiornamento manuale tramite trigger INSTEAD OF in tabelle e viste. SQL Server applica ALTER TRIGGER allo stesso modo per tutti i tipi di trigger (AFTER, INSTEAD-OF).

È possibile specificare il primo e l'ultimo trigger AFTER che si desidera eseguire in una tabella utilizzando sp_settriggerorder. È possibile specificare solo un primo e un ultimo trigger AFTER in una tabella. Se nella stessa tabella sono inclusi altri trigger AFTER, vengono eseguiti in modo casuale.

Se il primo o l'ultimo trigger viene modificato tramite un'istruzione ALTER TRIGGER, l'attributo first (primo) o last (ultimo) impostato per il trigger modificato viene rimosso ed è necessario reimpostare il valore di ordinamento tramite sp_settriggerorder.

Un trigger AFTER viene eseguito solo dopo il completamento dell'esecuzione dell'istruzione di trigger SQL, comprese tutte le operazioni referenziali di propagazione e le verifiche di vincolo associate all'oggetto aggiornato o eliminato. L'operazione di trigger AFTER controlla gli effetti dell'istruzione di trigger e tutte le operazioni UPDATE e DELETE referenziali di propagazione attivate con l'istruzione di trigger.

Quando un'operazione DELETE in una tabella figlio o di riferimento è il risultato di un'operazione CASCADE su un'operazione DELETE eseguita dalla tabella padre e viene definito un trigger INSTEAD OF per DELETE nella tabella figlio, il trigger viene ignorato mentre l'operazione DELETE viene eseguita.

Trigger DDL

Diversamente dai trigger DML, i trigger DDL non sono definiti a livello di ambito di schema. Pertanto, non è possibile utilizzare OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY e OBJECTPROPERTY(EX) durante l'esecuzione di query sui metadati relativi ai trigger DDL. Utilizzare in alternativa le viste del catalogo. Per ulteriori informazioni, vedere Informazioni sui trigger DDL.

Autorizzazioni

Per modificare un trigger DML è necessaria l'autorizzazione ALTER sulla tabella o vista in cui è definito il trigger.

Per modificare un trigger DDL definito con ambito server (ON ALL SERVER) o un trigger LOGON è necessaria l'autorizzazione CONTROL SERVER nel server. Per modificare un trigger DDL definito con ambito database (ON DATABASE) è necessaria l'autorizzazione ALTER ANY DATABASE DDL TRIGGER nel database corrente.

Esempi

Nell'esempio seguente viene creato un trigger DML per la stampa di un messaggio definito dall'utente nel client quando un utente aggiunge o modifica i dati della tabella SalesPersonQuotaHistory. Il trigger viene quindi modificato tramite ALTER TRIGGER per applicare il trigger soltanto sulle attività INSERT. Questo trigger risulta molto utile, in quanto ricorda all'utente che aggiorna o inserisce righe nella tabella di inviare una notifica al reparto Compensation.

USE AdventureWorks;
GO

IF OBJECT_ID(N'Sales.bonus_reminder', N'TR') IS NOT NULL
    DROP TRIGGER Sales.bonus_reminder;
GO

CREATE TRIGGER Sales.bonus_reminder
ON Sales.SalesPersonQuotaHistory
WITH ENCRYPTION
AFTER INSERT, UPDATE 
AS RAISERROR ('Notify Compensation', 16, 10);
GO

-- Now, change the trigger.
USE AdventureWorks;
GO

ALTER TRIGGER Sales.bonus_reminder
ON Sales.SalesPersonQuotaHistory
AFTER INSERT
AS RAISERROR ('Notify Compensation', 16, 10);
GO