CREATE TRIGGER (Transact-SQL)CREATE TRIGGER (Transact-SQL)

SI APPLICA A: sìSQL Server sìDatabase SQL di Azure noAzure SQL Data Warehouse noParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Crea un trigger DML, DDL o LOGON.Creates a DML, DDL, or logon trigger. Un trigger è una stored procedure di tipo speciale che viene eseguita automaticamente quando si verifica un evento nel server di database.A trigger is a special type of stored procedure that automatically runs when an event occurs in the database server. I trigger DML vengono eseguiti quando un utente prova a modificare i dati tramite un evento DML (Data Manipulation Language).DML triggers run when a user tries to modify data through a data manipulation language (DML) event. Gli eventi DML sono istruzioni INSERT, UPDATE o DELETE eseguite su una tabella o una vista.DML events are INSERT, UPDATE, or DELETE statements on a table or view. Questi trigger vengono attivati quando viene generato un evento valido, indipendentemente dal fatto che le righe della tabella siano interessate o meno.These triggers fire when any valid event fires, whether table rows are affected or not. Per altre informazioni, vedere DML Triggers.For more information, see DML Triggers.

I trigger DDL vengono eseguiti in risposta a vari eventi DDL (Data Definition Language).DDL triggers run in response to a variety of data definition language (DDL) events. Questi eventi corrispondono principalmente alle istruzioni CREATE, ALTER e DROP Transact-SQLTransact-SQL e ad alcune stored procedure di sistema che eseguono operazioni di tipo DDL.These events primarily correspond to Transact-SQLTransact-SQL CREATE, ALTER, and DROP statements, and certain system stored procedures that perform DDL-like operations.

I trigger LOGON vengono attivati in risposta all'evento LOGON generato quando viene stabilita una sessione utente.Logon triggers fire in response to the LOGON event that's raised when a user's session is being established. È possibile creare i trigger direttamente dalle istruzioni Transact-SQLTransact-SQL o dai metodi di assembly creati in Common Language Runtime (CLR) di MicrosoftMicrosoft .NET Framework.NET Framework e caricati in un'istanza di SQL ServerSQL Server.You can create triggers directly from Transact-SQLTransact-SQL statements or from methods of assemblies that are created in the MicrosoftMicrosoft .NET Framework.NET Framework common language runtime (CLR) and uploaded to an instance of SQL ServerSQL Server. SQL ServerSQL Server consente di creare più trigger per qualsiasi istruzione specifica.lets you create multiple triggers for any specific statement.

Importante

L'innalzamento di livello dei privilegi consente l'esecuzione di malware all'interno dei trigger.Malicious code inside triggers can run under escalated privileges. Per altre informazioni su come limitare tale minaccia, vedere Gestione della sicurezza dei trigger.For more information on how to mitigate this threat, see Manage Trigger Security.

Nota

In questo articolo viene illustrata l'integrazione di CLR di .NET Framework in SQL Server.The integration of .NET Framework CLR into SQL Server is discussed in this article. L'integrazione di CLR non si applica al database SQL di Azure.CLR integration does not apply to Azure SQL Database.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintassiSyntax

-- SQL Server Syntax  
-- Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger)  
  
CREATE [ OR ALTER ] TRIGGER [ schema_name . ]trigger_name   
ON { table | view }   
[ WITH <dml_trigger_option> [ ,...n ] ]  
{ FOR | AFTER | INSTEAD OF }   
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }   
[ WITH APPEND ]  
[ 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  
  
-- SQL Server Syntax  
-- Trigger on an INSERT, UPDATE, or DELETE statement to a 
-- table (DML Trigger on memory-optimized tables)  
  
CREATE [ OR ALTER ] TRIGGER [ schema_name . ]trigger_name   
ON { table }   
[ WITH <dml_trigger_option> [ ,...n ] ]  
{ FOR | AFTER }   
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }   
AS { sql_statement  [ ; ] [ ,...n ] }  
  
<dml_trigger_option> ::=  
    [ NATIVE_COMPILATION ]  
    [ SCHEMABINDING ]  
    [ EXECUTE AS Clause ]  
  
-- Trigger on a CREATE, ALTER, DROP, GRANT, DENY, 
-- REVOKE or UPDATE statement (DDL Trigger)  
  
CREATE [ OR ALTER ] TRIGGER trigger_name   
ON { ALL SERVER | DATABASE }   
[ WITH <ddl_trigger_option> [ ,...n ] ]  
{ FOR | AFTER } { event_type | event_group } [ ,...n ]  
AS { sql_statement  [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier >  [ ; ] }  
  
<ddl_trigger_option> ::=  
    [ ENCRYPTION ]  
    [ EXECUTE AS Clause ]  
  
-- Trigger on a LOGON event (Logon Trigger)  
  
CREATE [ OR 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 ]  
  

SintassiSyntax

-- Azure SQL Database Syntax   
-- Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger)  
  
CREATE [ OR ALTER ] TRIGGER [ schema_name . ]trigger_name   
ON { table | view }   
 [ WITH <dml_trigger_option> [ ,...n ] ]   
{ FOR | AFTER | INSTEAD OF }   
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }   
  AS { sql_statement  [ ; ] [ ,...n ] [ ; ] > }  
  
<dml_trigger_option> ::=   
        [ EXECUTE AS Clause ]  
  
-- Azure SQL Database Syntax  
-- Trigger on a CREATE, ALTER, DROP, GRANT, DENY, 
-- REVOKE, or UPDATE STATISTICS statement (DDL Trigger)   
  
CREATE [ OR ALTER ] TRIGGER trigger_name   
ON { DATABASE }   
 [ WITH <ddl_trigger_option> [ ,...n ] ]   
{ FOR | AFTER } { event_type | event_group } [ ,...n ]   
AS { sql_statement  [ ; ] [ ,...n ]  [ ; ] }  
  
<ddl_trigger_option> ::=   
    [ EXECUTE AS Clause ]  

ArgomentiArguments

OR ALTEROR ALTER
Si applica a: Azure Database SQLSQL Database, SQL ServerSQL Server (a partire da SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1).Applies to: Azure Database SQLSQL Database, SQL ServerSQL Server (starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1).

Modifica in modo condizionale il trigger solo se esiste già.Conditionally alters the trigger only if it already exists.

schema_nameschema_name
Nome dello schema a cui appartiene un trigger DML.The name of the schema to which a DML trigger belongs. L'ambito dei trigger DML è definito nello schema della tabella o della vista in cui sono creati i trigger stessi.DML triggers are scoped to the schema of the table or view on which they're created. schema_name non può essere specificato per i trigger DDL o LOGON.schema_name can't be specified for DDL or logon triggers.

trigger_nametrigger_name
Nome del trigger.The name of the trigger. trigger_name deve seguire le regole per gli identificatori, a eccezione del fatto che trigger_name non può iniziare con # o ##.A trigger_name must follow the rules for identifiers, except that trigger_name can't start with # or ##.

table | viewtable | view
Tabella o vista nella quale viene eseguito il trigger DML.The table or view on which the DML trigger runs. Questa tabella o vista è anche nota come tabella di trigger o vista di trigger.This table or view is sometimes referred to as the trigger table or trigger view. Il nome completo della tabella o della vista è facoltativo.Specifying the fully qualified name of the table or view is optional. È possibile fare riferimento a una vista solo tramite un trigger INSTEAD OF.You can only reference a view by an INSTEAD OF trigger. Non è possibile definire trigger DML in tabelle temporanee globali o locali.You can't define DML triggers on local or global temporary tables.

DATABASEDATABASE
Applica l'ambito di un trigger DDL al database corrente.Applies the scope of a DDL trigger to the current database. Se viene specificato questo parametro, il trigger viene attivato quando si verifica event_type o event_group nel database corrente.If specified, the trigger fires whenever event_type or event_group occurs in the current database.

ALL SERVERALL SERVER
Si applica a: SQL Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Applica l'ambito di un trigger DDL o LOGON al server corrente.Applies the scope of a DDL or logon trigger to the current server. Se viene specificato questo parametro, il trigger viene attivato quando si verifica event_type o event_group nel server corrente.If specified, the trigger fires whenever event_type or event_group occurs anywhere in the current server.

WITH ENCRYPTIONWITH ENCRYPTION
Si applica a: SQL Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Occulta il testo dell'istruzione CREATE TRIGGER.Obscures the text of the CREATE TRIGGER statement. Tramite il parametro WITH ENCRYPTION è possibile evitare la pubblicazione del trigger come parte della replica di SQL ServerSQL Server.Using WITH ENCRYPTION prevents the trigger from being published as part of SQL ServerSQL Server replication. Non è possibile specificare WITH ENCRYPTION per i trigger CLR.WITH ENCRYPTION can't be specified for CLR triggers.

EXECUTE ASEXECUTE AS
Specifica il contesto di sicurezza nel quale viene eseguito il trigger.Specifies the security context under which the trigger is executed. Consente di controllare l'account utente utilizzato dall'istanza di SQL ServerSQL Server per convalidare le autorizzazioni per ogni oggetto di database a cui fa riferimento il trigger.Enables you to control which user account the instance of SQL ServerSQL Server uses to validate permissions on any database objects that are referenced by the trigger.

Questa opzione è obbligatoria per i trigger sulle tabelle ottimizzate per la memoria.This option is required for triggers on memory-optimized tables.

Per altre informazioni, vedere Clausola EXECUTE AS (Transact-SQL).For more information, seeEXECUTE AS Clause (Transact-SQL).

NATIVE_COMPILATIONNATIVE_COMPILATION
Indica che il trigger viene compilato in modo nativo.Indicates that the trigger is natively compiled.

Questa opzione è obbligatoria per i trigger sulle tabelle ottimizzate per la memoria.This option is required for triggers on memory-optimized tables.

SCHEMABINDINGSCHEMABINDING
Assicura che le tabelle a cui si fa riferimento in un trigger non possano essere eliminate o modificate.Ensures that tables referenced by a trigger can't be dropped or altered.

Questa opzione è necessaria per i trigger sulle tabelle ottimizzate per la memoria e non è supportata per i trigger su tabelle tradizionali.This option is required for triggers on memory-optimized tables and isn't supported for triggers on traditional tables.

FOR | AFTERFOR | AFTER
AFTER specifica che il trigger DML viene attivato solo al termine dell'avvio di tutte le operazioni specificate nell'istruzione di trigger SQL.AFTER specifies that the DML trigger fires only when all operations specified in the triggering SQL statement have launched successfully. Perché il trigger venga attivato, è anche necessario che siano stati completati tutti i controlli dei vincoli e le operazioni referenziali di propagazione.All referential cascade actions and constraint checks must also succeed before this trigger fires.

AFTER è il tipo di trigger predefinito quando FOR è l'unica parola chiave specificata.AFTER is the default when FOR is the only keyword specified.

Non è possibile definire trigger i AFTER sulle viste.You can't define AFTER triggers on views.

INSTEAD OFINSTEAD OF
Specifica che il trigger DML viene avviato al posto dell'istruzione di trigger SQL. Il trigger risulta quindi prioritario rispetto alle operazioni delle istruzioni di trigger.Specifies that the DML trigger launches instead of the triggering SQL statement, thus, overriding the actions of the triggering statements. Non è possibile specificare INSTEAD OF per i trigger DDL o LOGON.You can't specify INSTEAD OF for DDL or logon triggers.

In una tabella o vista è possibile definire al massimo un trigger INSTEAD OF per ogni istruzione INSERT, UPDATE o DELETE.At most, you can define one INSTEAD OF trigger per INSERT, UPDATE, or DELETE statement on a table or view. È anche possibile definire viste che fanno riferimento ad altre viste. Ogni vista include un trigger INSTEAD OF.You can also define views on views where each view has its own INSTEAD OF trigger.

Non è possibile definire i trigger INSTEAD OF in viste aggiornabili che usano WITH CHECK OPTION.You can't define INSTEAD OF triggers on updatable views that use WITH CHECK OPTION. Questa operazione in SQL ServerSQL Server genera un errore quando un trigger INSTEAD OF viene aggiunto a una vista aggiornabile per la quale è stato specificato WITH CHECK OPTION.SQL ServerSQL Server Doing so results in an error when an INSTEAD OF trigger is added to an updatable view WITH CHECK OPTION specified. Per poter definire il trigger INSTEAD OF, si rimuove l'opzione usando l'istruzione ALTER VIEW.You remove that option by using ALTER VIEW before defining the INSTEAD OF trigger.

{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }
Specifica le istruzioni di modifica dei dati che attivano il trigger DML quando vengono eseguite sulla tabella o sulla vista.Specifies the data modification statements that activate the DML trigger when it's tried against this table or view. Specificare almeno un'opzione.Specify at least one option. Usare qualsiasi combinazione delle opzioni nell'ordine desiderato nella definizione di trigger.Use any combination of these options in any order in the trigger definition.

Per i trigger INSTEAD OF, non è possibile usare l'opzione DELETE in tabelle contenenti una relazione referenziale che specifica un'operazione di propagazione ON DELETE.For INSTEAD OF triggers, you can't use the DELETE option on tables that have a referential relationship, specifying a cascade action ON DELETE. In modo analogo, l'opzione UPDATE non è consentita in tabelle contenenti una relazione referenziale che specifica un'operazione di propagazione ON UPDATE.Similarly, the UPDATE option isn't allowed on tables that have a referential relationship, specifying a cascade action ON UPDATE.

WITH APPENDWITH APPEND
Si applica a: SQL Server 2008SQL Server 2008 tramite SQL Server 2008 R2SQL Server 2008 R2.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2008 R2SQL Server 2008 R2.

Specifica che deve essere aggiunto un altro trigger di un tipo già esistente.Specifies that an additional trigger of an existing type should be added. La clausola WITH APPEND non può essere usata con trigger INSTEAD OF o quando un trigger AFTER viene dichiarato in modo esplicito.WITH APPEND can't be used with INSTEAD OF triggers or if an AFTER trigger is explicitly stated. Per la compatibilità con le versioni precedenti, usare la clausola WITH APPEND solo quando viene specificata la parola chiave FOR, senza INSTEAD OF o AFTER.For backward compatibility, only use WITH APPEND when FOR is specified, without INSTEAD OF or AFTER. Non è possibile specificare WITH APPEND se si usa EXTERNAL NAME (ovvero se il trigger è un trigger CLR).You can't specify WITH APPEND if using EXTERNAL NAME (that is, if the trigger is a CLR trigger).

event_typeevent_type
Nome di un evento del linguaggio Transact-SQLTransact-SQL che, dopo l'avvio, attiva un trigger DDL.The name of a Transact-SQLTransact-SQL language event that, after launch, causes a DDL trigger to fire. Gli eventi supportati dai trigger DDL sono elencati in Eventi DDL.Valid events for DDL triggers are listed in DDL Events.

event_groupevent_group
Nome di un raggruppamento predefinito di eventi del linguaggio Transact-SQLTransact-SQL.The name of a predefined grouping of Transact-SQLTransact-SQL language events. Il trigger DDL viene attivato dopo l'avvio di qualsiasi evento del linguaggio Transact-SQLTransact-SQL appartenente a event_group.The DDL trigger fires after launch of any Transact-SQLTransact-SQL language event that belongs to event_group. I gruppi di eventi supportati dai trigger DDL sono elencati in Gruppi di eventi DDL.Valid event groups for DDL triggers are listed in DDL Event Groups.

Dopo il completamento dell'esecuzione di CREATE TRIGGER, event_group funge anche da macro aggiungendo i tipi di eventi che include alla vista del catalogo sys.trigger_events.After the CREATE TRIGGER has finished running, event_group also acts as a macro by adding the event types it covers to the sys.trigger_events catalog view.

NOT FOR REPLICATIONNOT FOR REPLICATION
Si applica a: SQL Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Indica che il trigger non deve essere eseguito quando un agente di replica modifica la tabella coinvolta nel trigger.Indicates that the trigger shouldn't be run when a replication agent modifies the table that's involved in the trigger.

sql_statementsql_statement
Condizioni e azioni del trigger.The trigger conditions and actions. Le condizioni del trigger specificano ulteriori criteri che determinano se gli eventi DML, DDL o LOGON che si prova a eseguire avviano l'esecuzione delle azioni del trigger.Trigger conditions specify additional criteria that determine whether the tried DML, DDL, or logon events cause the trigger actions to be run.

Le azioni del trigger specificate nelle istruzioni Transact-SQLTransact-SQL vengono attivate quando viene tentato di eseguire l'operazione.The trigger actions specified in the Transact-SQLTransact-SQL statements go into effect when the operation is tried.

I trigger possono includere un numero qualsiasi di istruzioni Transact-SQLTransact-SQL di qualunque tipo, con alcune eccezioni.Triggers can include any number and type of Transact-SQLTransact-SQL statements, with exceptions. Per altre informazioni, vedere la sezione Osservazioni.For more information, see Remarks. Un trigger verifica o modifica dati in base a un'istruzione di modifica o di definizione dei dati, senza restituire dati all'utente.A trigger is designed to check or change data based on a data modification or definition statement; it should't return data to the user. Le istruzioni Transact-SQLTransact-SQL di un trigger spesso includono elementi del linguaggio per il controllo di flusso.The Transact-SQLTransact-SQL statements in a trigger frequently include control-of-flow language.

I trigger DML utilizzano le tabelle logiche o concettuali Inserted e Deleted.DML triggers use the deleted and inserted logical (conceptual) tables. Da un punto di vista strutturale queste tabelle sono simili alla tabella in cui viene definito il trigger, ovvero la tabella in cui si prova a eseguire l'azione utente.They're structurally similar to the table on which the trigger is defined, that is, the table on which the user action is tried. Le tabelle Deleted e Inserted contengono i valori precedenti o i nuovi valori delle righe che potrebbero essere modificate dall'azione utente.The deleted and inserted tables hold the old values or new values of the rows that may be changed by the user action. Ad esempio, per recuperare tutti i valori nella tabella deleted, è possibile utilizzare il codice seguente:For example, to retrieve all values in the deleted table, use:

SELECT * FROM deleted;  

Per altre informazioni, vedere Usare le tabelle inserted e deleted.For more information, see Use the inserted and deleted Tables.

I trigger DDL e LOGON acquisiscono informazioni sull'evento che attiva il trigger tramite la funzione EVENTDATA (Transact-SQL).DDL and logon triggers capture information about the triggering event by using the EVENTDATA (Transact-SQL) function. Per altre informazioni, vedere Utilizzo della funzione EVENTDATA.For more information, see Use the EVENTDATA Function.

In SQL ServerSQL Server è possibile aggiornare le colonne di tipo text, ntext o image di tabelle o viste tramite il trigger INSTEAD OF.SQL ServerSQL Server allows the update of text, ntext, or image columns through the INSTEAD OF trigger on tables or views.

Importante

I tipi di dati ntext, text e image verranno rimossi in una versione futura di MicrosoftMicrosoftSQL ServerSQL Server.ntext, text, and image data types will be removed in a future version of MicrosoftMicrosoftSQL ServerSQL Server. Evitare di utilizzare questi tipi di dati in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni che attualmente li utilizzano.Avoid using these data types in new development work, and plan to modify applications that currently use them. Usare in alternativa nvarchar(max), varchar(max)e varbinary(max) .Use nvarchar(max), varchar(max), and varbinary(max) instead. I trigger AFTER e INSTEAD OF supportano i dati varchar(MAX), nvarchar(MAX) e varbinary(MAX) nelle tabelle inserted e deleted.Both AFTER and INSTEAD OF triggers support varchar(MAX), nvarchar(MAX), and varbinary(MAX) data in the inserted and deleted tables.

Per i trigger sulle tabelle ottimizzate per la memoria, un blocco ATOMIC è l'unica istruzione sql_statement consentita al livello superiore.For triggers on memory-optimized tables, the only sql_statement allowed at the top level is an ATOMIC block. L'unico codice T-SQL consentito all'interno del blocco ATOMIC è quello consentito nelle procedure native.The T-SQL allowed inside the ATOMIC block is limited by the T-SQL allowed inside native procs.

< method_specifier > Si applica a: da SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017.< method_specifier > Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Per un trigger CLR, specifica il metodo di un assembly da associare al trigger.For a CLR trigger, specifies the method of an assembly to bind with the trigger. Il metodo non deve accettare nessun argomento e restituire void.The method must take no arguments and return void. class_name deve essere un identificatore di SQL ServerSQL Server valido e deve esistere come classe nell'assembly con visibilità dell'assembly.class_name must be a valid SQL ServerSQL Server identifier and must exist as a class in the assembly with assembly visibility. Se alla classe è stato assegnato un nome completo con lo spazio dei nomi le cui parti sono separate da '.', il nome della classe deve essere delimitato tramite [ ] o " ".If the class has a namespace-qualified name that uses '.' to separate namespace parts, the class name must be delimited by using [ ] or " " delimiters. La classe non può essere nidificata.The class can't be a nested class.

Nota

Per impostazione predefinita, la capacità di SQL ServerSQL Server di eseguire il codice CLR è disattivata.By default, the ability of SQL ServerSQL Server to run CLR code is off. È possibile creare, modificare ed eliminare oggetti di database che fanno riferimento a moduli di codice gestito, ma tali riferimenti non vengono eseguiti in un'istanza di SQL ServerSQL Server a meno che non si abiliti l'opzione clr enabled tramite sp_configure.You can create, modify, and drop database objects that reference managed code modules, but these references don't run in an instance of SQL ServerSQL Server unless the clr enabled Option is enabled by using sp_configure.

Considerazioni sui trigger DMLRemarks for DML Triggers

I trigger DML vengono utilizzati di frequente per applicare regole business e integrità dei dati.DML triggers are frequently used for enforcing business rules and data integrity. SQL ServerSQL Server fornisce l'integrità referenziale dichiarativa tramite le istruzioni ALTER TABLE e CREATE TABLE.provides declarative referential integrity (DRI) through the ALTER TABLE and CREATE TABLE statements. DRI, tuttavia, non supporta l'integrità referenziale tra database.However, DRI doesn't provide cross-database referential integrity. L'integrità referenziale fa riferimento alle regole riguardanti le relazioni tra le chiavi primarie ed esterne delle tabelle.Referential integrity refers to the rules about the relationships between the primary and foreign keys of tables. Per applicare l'integrità referenziale, utilizzare i vincoli PRIMARY KEY e FOREIGN KEY in ALTER TABLE e CREATE TABLE.To enforce referential integrity, use the PRIMARY KEY and FOREIGN KEY constraints in ALTER TABLE and CREATE TABLE. Gli eventuali vincoli esistenti nella tabella di trigger vengono controllati dopo l'esecuzione del trigger INSTEAD OF e prima dell'esecuzione del trigger AFTER.If constraints exist on the trigger table, they're checked after the INSTEAD OF trigger runs and before the AFTER trigger runs. In caso di violazione dei vincoli, viene eseguito il rollback delle azioni del trigger INSTEAD OF e il trigger AFTER non viene attivato.If the constraints are violated, the INSTEAD OF trigger actions are rolled back and the AFTER trigger isn't fired.

È possibile specificare il primo e l'ultimo trigger AFTER da eseguire in una tabella usando sp_settriggerorder.You can specify the first and last AFTER triggers to be run on a table by using sp_settriggerorder. In una tabella è possibile specificare un solo trigger AFTER da eseguire per primo e un solo trigger AFTER da eseguire per ultimo per ogni operazione INSERT, UPDATE e DELETE.You can specify only one first and one last AFTER trigger for each INSERT, UPDATE, and DELETE operation on a table. Se nella stessa tabella sono inclusi altri trigger AFTER, vengono eseguiti in modo casuale.If there are other AFTER triggers on the same table, they're randomly run.

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.If an ALTER TRIGGER statement changes a first or last trigger, the first or last attribute set on the modified trigger is dropped, and you must reset the order value by using sp_settriggerorder.

Un trigger AFTER viene eseguito solo dopo il completamento dell'esecuzione dell'istruzione SQL di trigger,An AFTER trigger is run only after the triggering SQL statement has run successfully. comprese tutte le operazioni referenziali di propagazione e le verifiche di vincolo associate all'oggetto aggiornato o eliminato.This successful execution includes all referential cascade actions and constraint checks associated with the object updated or deleted. Un trigger AFTER non genera in modo ricorsivo un trigger INSTEAD OF nella stessa tabella.An AFTER does not recursively fire an INSTEAD OF trigger on the same table.

Se un trigger INSTEAD OF definito in una tabella esegue un'istruzione sulla tabella che normalmente comporterebbe una seconda attivazione del trigger INSTEAD OF, il trigger non viene chiamato in modo ricorsivo.If an INSTEAD OF trigger defined on a table runs a statement against the table that would ordinarily fire the INSTEAD OF trigger again, the trigger isn't called recursively. L'istruzione viene elaborata come se la tabella non includesse un trigger INSTEAD OF e avvia la serie di operazioni sui vincoli e di esecuzioni dei trigger AFTER,Instead, the statement processes as if the table had no INSTEAD OF trigger and starts the chain of constraint operations and AFTER trigger executions. ad esempio se un trigger viene definito come trigger INSTEAD OF INSERT per una tabella.For example, if a trigger is defined as an INSTEAD OF INSERT trigger for a table. Il trigger esegue inoltre un'istruzione INSERT sulla stessa tabella e l'istruzione INSERT avviata dal trigger INSTEAD OF non chiama nuovamente il trigger.And, the trigger runs an INSERT statement on the same table, the INSERT statement launched by the INSTEAD OF trigger doesn't call the trigger again. L'istruzione INSERT lanciata dal trigger avvia il processo di esecuzione delle operazioni sui vincoli e di attivazione di tutti i trigger AFTER INSERT definiti per la tabella.The INSERT launched by the trigger starts the process of running constraint actions and firing any AFTER INSERT triggers defined for the table.

Quando un trigger INSTEAD OF definito in una vista esegue un'istruzione sulla vista che normalmente comporterebbe una seconda attivazione del trigger INSTEAD OF, il trigger non viene chiamato in modo ricorsivo.When an INSTEAD OF trigger defined on a view runs a statement against the view that would ordinarily fire the INSTEAD OF trigger again, it's not called recursively. L'istruzione viene risolta sotto forma di modifiche delle tabelle di base sottostanti della vista.Instead, the statement is resolved as modifications against the base tables underlying the view. In tal caso, la definizione della vista deve rispettare tutte le restrizioni previste per una vista aggiornabile.In this case, the view definition must meet all the restrictions for an updatable view. Per una definizione di viste aggiornabili, vedere Modificare i dati tramite una vista.For a definition of updatable views, see Modify Data Through a View.

Ad esempio, se un trigger viene definito come trigger INSTEAD OF UPDATE per una vista.For example, if a trigger is defined as an INSTEAD OF UPDATE trigger for a view. Il trigger esegue inoltre un'istruzione UPDATE che fa riferimento alla stessa vista e l'istruzione UPDATE avviata dal trigger INSTEAD OF non chiama nuovamente il trigger.And, the trigger runs an UPDATE statement referencing the same view, the UPDATE statement launched by the INSTEAD OF trigger doesn't call the trigger again. L'istruzione UPDATE avviata dal trigger viene elaborata rispetto alla vista come se la vista non includesse un trigger INSTEAD OF.The UPDATE launched by the trigger is processed against the view as if the view didn't have an INSTEAD OF trigger. Le colonne modificate da UPDATE devono essere risolte in una singola tabella di base.The columns changed by the UPDATE must be resolved to a single base table. Ogni modifica di una tabella di base sottostante avvia il processo di applicazione dei vincoli e di attivazione dei trigger AFTER definiti per la tabella.Each modification to an underlying base table starts the chain of applying constraints and firing AFTER triggers defined for the table.

Test di azioni UPDATE o INSERT eseguite su colonne specificheTesting for UPDATE or INSERT Actions to Specific Columns

È possibile progettare un trigger Transact-SQLTransact-SQL in modo che esegua determinate azioni in base a modifiche di tipo UPDATE o INSERT in colonne specifiche.You can design a Transact-SQLTransact-SQL trigger to do certain actions based on UPDATE or INSERT modifications to specific columns. A tale scopo, usare UPDATE() o COLUMNS_UPDATED nel corpo del trigger.Use UPDATE() or COLUMNS_UPDATED in the body of the trigger for this purpose. UPDATE() consente di testare i tentativi di esecuzione di UPDATE o INSERT per una colonna.UPDATE() tests for UPDATE or INSERT attempts on one column. COLUMNS_UPDATED controlla l'esecuzione delle operazioni UPDATE o INSERT in più colonne.COLUMNS_UPDATED tests for UPDATE or INSERT actions that run on multiple columns. Questa funzione restituisce uno schema di bit che indica le colonne inserite o aggiornate.This function returns a bit pattern that indicates which columns were inserted or updated.

Limitazioni dei triggerTrigger Limitations

CREATE TRIGGER deve essere la prima istruzione del batch e può essere applicata a una sola tabella.CREATE TRIGGER must be the first statement in the batch and can apply to only one table.

I trigger vengono creati solo nel database corrente, ma possono fare riferimento a oggetti esterni a tale database.A trigger is created only in the current database; however, a trigger can reference objects outside the current database.

Se viene specificato il nome dello schema del trigger, è necessario qualificare allo stesso modo anche il nome della tabella.If the trigger schema name is specified to qualify the trigger, qualify the table name in the same way.

All'interno di un'istruzione CREATE TRIGGER è possibile definire la stessa azione di trigger per più azioni utente, ad esempio INSERT e UPDATE.The same trigger action can be defined for more than one user action (for example, INSERT and UPDATE) in the same CREATE TRIGGER statement.

Non è possibile definire trigger INSTEAD OF DELETE/UPDATE in una tabella con una chiave esterna per cui è stata definita un'operazione di propagazione ON DELETE/UPDATE.INSTEAD OF DELETE/UPDATE triggers can't be defined on a table that has a foreign key with a cascade on DELETE/UPDATE action defined.

In un trigger è possibile specificare qualsiasi istruzione SET.Any SET statement can be specified inside a trigger. L'opzione SET scelta rimane attiva durante l'esecuzione del trigger, dopodiché viene ripristinata l'impostazione precedente.The SET option selected remains in effect during the execution of the trigger and then reverts to its former setting.

Quando un trigger viene attivato, i risultati vengono restituiti all'applicazione chiamante, esattamente come per le stored procedure.When a trigger fires, results are returned to the calling application, just like with stored procedures. Per impedire la restituzione di risultati a un'applicazione in seguito all'attivazione di un trigger, non includere istruzioni SELECT che restituiscono risultati o istruzioni che eseguono assegnazioni di variabili in un trigger.To prevent results being returned to an application because of a trigger firing, don't include either SELECT statements that return results or statements that carry out variable assignment in a trigger. Un trigger che include istruzioni SELECT che restituiscono risultati all'utente oppure istruzioni che eseguono l'assegnazione di variabili richiede una gestione speciale.A trigger that includes either SELECT statements that return results to the user or statements that do variable assignment, requires special handling. Sarebbe necessario scrivere i risultati restituiti in ogni applicazione in cui è consentito apportare modifiche alla tabella di trigger.You'd have to write the returned results into every application in which modifications to the trigger table are allowed. Se è necessario eseguire un'assegnazione di variabile in un trigger, utilizzare un'istruzione SET NOCOUNT all'inizio del trigger per impedire la restituzione dei set di risultati.If variable assignment must occur in a trigger, use a SET NOCOUNT statement at the start of the trigger to prevent the return of any result sets.

Anche se un'istruzione TRUNCATE TABLE è in effetti un'istruzione DELETE, non attiva un trigger perché l'operazione non registra singole eliminazioni di righe.Although a TRUNCATE TABLE statement is in effect a DELETE statement, it doesn't activate a trigger because the operation doesn't log individual row deletions. Solo gli utenti con le autorizzazioni per eseguire un'istruzione TRUNCATE TABLE devono tuttavia fare attenzione a non eludere un trigger DELETE in questo modo.However, only those users with permissions to run a TRUNCATE TABLE statement need be concerned about inadvertently circumventing a DELETE trigger this way.

L'istruzione WRITETEXT non attiva alcun trigger, indipendentemente dal fatto che sia registrata o meno.The WRITETEXT statement, whether logged or unlogged, doesn't activate a trigger.

Le istruzioni Transact-SQLTransact-SQL seguenti non sono consentite in un trigger DML:The following Transact-SQLTransact-SQL statements aren't allowed in a DML trigger:

ALTER DATABASEALTER DATABASE CREATE DATABASECREATE DATABASE DROP DATABASEDROP DATABASE
RESTORE DATABASERESTORE DATABASE RESTORE LOGRESTORE LOG RECONFIGURERECONFIGURE

Inoltre, le istruzioni Transact-SQLTransact-SQL seguenti non sono consentite nel corpo di un trigger DML eseguito sulla tabella o sulla vista che rappresenta la destinazione dell'azione del trigger.Additionally, the following Transact-SQLTransact-SQL statements aren't allowed inside the body of a DML trigger when it's used against the table or view that's the target of the triggering action.

CREATE INDEX (incluse CREATE SPATIAL INDEX e CREATE XML INDEX)CREATE INDEX (including CREATE SPATIAL INDEX and CREATE XML INDEX) ALTER INDEXALTER INDEX DROP INDEXDROP INDEX
DBCC DBREINDEXDBCC DBREINDEX ALTER PARTITION FUNCTIONALTER PARTITION FUNCTION DROP TABLEDROP TABLE
ALTER TABLE quando viene utilizzata per eseguire le operazioni seguenti:ALTER TABLE when used to do the following:

Aggiungere, modificare o eliminare colonne.Add, modify, or drop columns.

Passare da una partizione all'altra.Switch partitions.

Aggiungere o eliminare vincoli PRIMARY KEY o UNIQUE.Add or drop PRIMARY KEY or UNIQUE constraints.

Nota

Poiché in SQL ServerSQL Server non è supportata l'esecuzione di trigger definiti dall'utente su tabelle di sistema, è consigliabile evitare di creare trigger definiti dall'utente per tabelle di sistema.Because SQL ServerSQL Server does not support user-defined triggers on system tables, we recommend that you do not create user-defined triggers on system tables.

Ottimizzazione di trigger DMLOptimizing DML Triggers

I trigger funzionano all'interno di transazioni (implicite o meno) e, mentre sono aperti, bloccano risorse.Triggers work in transactions (implied or otherwise) and while they're open, they lock resources. Il blocco rimane finché la transazione non viene confermata (con COMMIT) o rifiutata (con ROLLBACK).The lock remains in place until the transaction is confirmed (with COMMIT) or rejected (with a ROLLBACK). Più a lungo viene eseguito un trigger, maggiore è la probabilità che un altro processo venga bloccato.The longer a trigger runs, the higher the probability that another process is then blocked. Scrivere quindi i trigger in modo da ridurne la durata, quando è possibile.So, write triggers to lessen their duration whenever possible. Un modo per ottenere una durata più breve consiste nel rilasciare un trigger quando un'istruzione DML modifica zero righe.One way to achieve shorter duration is to release a trigger when a DML statement changes zero rows.

Per rilasciare il trigger per un comando che non modifica alcuna riga, usare la variabile di sistema ROWCOUNT_BIG.To release the trigger for a command that doesn't change any rows, employ the system variable ROWCOUNT_BIG.

Il frammento di codice T-SQL seguente illustra come rilasciare il trigger per un comando che non modifica alcuna riga.The following T-SQL code snippet shows how to release the trigger for a command that doesn't change any rows. Questo codice dovrebbe essere presente all'inizio di ogni trigger DML:This code should be present at the beginning of each DML trigger:

IF (ROWCOUNT_BIG() = 0)
RETURN;

Considerazioni sui i trigger DDLRemarks for DDL Triggers

I trigger DDL, analogamente ai trigger standard, avviano stored procedure in risposta a un evento.DDL triggers, like standard triggers, launch stored procedures in response to an event. A differenza dei trigger standard, tuttavia, non vengono eseguiti in risposta a istruzioni UPDATE, INSERT o DELETE su una tabella o una vista.But, unlike standard triggers, they don't run in response to UPDATE, INSERT, or DELETE statements on a table or view. I trigger DDL in genere vengono eseguiti in risposta a istruzioni DDL (Data Definition Language).Instead, they primarily run in response to data definition language (DDL) statements. I tipi di istruzioni includono CREATE, ALTER, DROP, GRANT, DENY, REVOKE e UPDATE STATISTICS.The statement types include CREATE, ALTER, DROP, GRANT, DENY, REVOKE, and UPDATE STATISTICS. Alcune stored procedure di sistema che eseguono operazioni di tipo DDL possono anche attivare trigger DDL.Certain system stored procedures that carry out DDL-like operations can also fire DDL triggers.

Importante

Testare i trigger DDL per determinarne la risposta all'esecuzione delle stored procedure di sistema.Test your DDL triggers to determine their responses to system stored procedure execution. Sia l'istruzione CREATE TYPE che le stored procedure sp_addtype e sp_rename, ad esempio, attivano un trigger DDL creato in un evento CREATE_TYPE.For example, the CREATE TYPE statement and the sp_addtype and sp_rename stored procedures fire a DDL trigger that's created on a CREATE_TYPE event.

Per altre informazioni sui trigger DDL, vedere Trigger DDL.For more information about DDL triggers, see DDL Triggers.

I trigger DDL non vengono attivati in risposta a eventi che interessano stored procedure e tabelle temporanee globali o locali.DDL triggers don't fire in response to events that affect local or global temporary tables and stored procedures.

Diversamente dai trigger DML, i trigger DDL non sono definiti a livello di ambito di schema.Unlike DML triggers, DDL triggers aren't scoped to schemas. Non è quindi possibile usare funzioni quali OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY e OBJECTPROPERTYEX durante l'esecuzione di query sui metadati relativi ai trigger DDL.So, you can't use functions such as OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY, and OBJECTPROPERTYEX for querying metadata about DDL triggers. Utilizzare in alternativa le viste del catalogo.Use the catalog views instead. Per altre informazioni, vedere Ottenere informazioni sui trigger DDL.For more information, see Get Information About DDL Triggers.

Nota

I trigger DDL con ambito server sono disponibili in Esplora oggetti di SQL Server Management StudioSQL Server Management Studio nella cartella Trigger.Server-scoped DDL triggers appear in the SQL Server Management StudioSQL Server Management Studio Object Explorer in the Triggers folder. all'interno della cartella Oggetti server .This folder is located under the Server Objects folder. I trigger DDL con ambito database sono disponibili nella cartella Trigger database.Database-scoped DDL Triggers appear in the Database Triggers folder. all'interno della cartella Programmabilità del database corrispondente.This folder is located under the Programmability folder of the corresponding database.

Trigger LOGONLogon Triggers

I trigger LOGON attivano stored procedure in risposta a un evento LOGONLogon triggers carry out stored procedures in response to a LOGON event. che si verifica quando viene stabilita una sessione utente a un'istanza di SQL ServerSQL Server.This event happens when a user session is established with an instance of SQL ServerSQL Server. I trigger LOGON vengono attivati dopo il completamento della fase di autenticazione della procedura di accesso, ma prima che la sessione utente venga stabilita,Logon triggers fire after the authentication phase of logging in finishes, but before the user session is established. quindi tutti i messaggi generati all'interno del trigger che verrebbero normalmente visualizzati all'utente, come i messaggi di errore e i messaggi dall'istruzione PRINT, vengono invece indirizzati al log degli errori di SQL ServerSQL Server.So, all messages originating inside the trigger that would typically reach the user, such as error messages and messages from the PRINT statement, are diverted to the SQL ServerSQL Server error log. Per altre informazioni, vedere Trigger LOGON.For more information, see Logon Triggers.

I trigger LOGON non vengono attivati in caso di esito negativo dell'autenticazione.Logon triggers don't fire if authentication fails.

In un trigger LOGON non sono supportate transazioni distribuite.Distributed transactions aren't supported in a logon trigger. Quando viene attivato un trigger LOGON contenente una transazione distribuita, viene restituito l'errore 3969.Error 3969 returns when a logon trigger that contains a distributed transaction fire.

Disabilitazione di un trigger di accessoDisabling a Logon Trigger

Un trigger di accesso può impedire le connessioni al Motore di databaseDatabase Engine per tutti gli utenti, inclusi i membri del ruolo predefinito del server sysadmin .A logon trigger can effectively prevent successful connections to the Motore di databaseDatabase Engine for all users, including members of the sysadmin fixed server role. Quando un trigger di accesso impedisce le connessioni, i membri del ruolo predefinito del server sysadmin possono connettersi tramite la connessione amministrativa dedicata o avviando il Motore di databaseDatabase Engine nella modalità di configurazione minima (- f).When a logon trigger is preventing connections, members of the sysadmin fixed server role can connect by using the dedicated administrator connection, or by starting the Motore di databaseDatabase Engine in minimal configuration mode (-f). Per altre informazioni, vedere Opzioni di avvio del servizio del motore di database.For more information, see Database Engine Service Startup Options.

Considerazioni generali sui triggerGeneral Trigger Considerations

Restituzione di risultatiReturning Results

Nelle versioni future di SQL Server la possibilità di ottenere risultati dai trigger non sarà più disponibile.The ability to return results from triggers will be removed in a future version of SQL Server. I trigger che restituiscono set di risultati possono provocare comportamenti imprevisti nelle applicazioni che non sono state progettate per il loro utilizzo.Triggers that return result sets may cause unexpected behavior in applications that aren't designed to work with them. Evitare di restituire set di risultati dai trigger in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni che attualmente li restituiscono.Avoid returning result sets from triggers in new development work, and plan to modify applications that currently do. Per impedire che i trigger restituiscano set di risultati, impostare l'opzione disallow results from triggers (Non consentire risultati dai trigger) su 1.To prevent triggers from returning result sets, set the disallow results from triggers option to 1.

I trigger LOGON non consentono mai la restituzione di set di risultati e questo comportamento non è configurabile.Logon triggers always disallow the return of results sets and this behavior isn't configurable. Se un trigger LOGON genera un set di risultati, l'avvio del trigger ha esito negativo e viene negato il tentativo di accesso che ha attivato il trigger.If a logon trigger generates a result set, the trigger fails to launch and the login attempt that fired the trigger is denied.

Più triggerMultiple Triggers

SQL ServerSQL Server consente di creare più trigger per ogni evento DML, DDL o LOGON.lets you create multiple triggers for each DML, DDL, or LOGON event. Se, ad esempio, viene eseguita l'istruzione CREATE TRIGGER FOR UPDATE per una tabella che ha già un trigger UPDATE, viene creato un ulteriore trigger di aggiornamento.For example, if CREATE TRIGGER FOR UPDATE is run for a table that already has an UPDATE trigger, an additional update trigger is created. Nelle versioni precedenti di SQL ServerSQL Server è possibile creare un solo trigger per ogni evento di modifica dei dati INSERT, UPDATE o DELETE per ogni tabella.In earlier versions of SQL ServerSQL Server, only one trigger for each INSERT, UPDATE, or DELETE data modification event is allowed for each table.

Trigger ricorsiviRecursive Triggers

SQL ServerSQL Server supporta anche chiamate ricorsive di trigger quando viene abilitata l'impostazione RECURSIVE_TRIGGERS con ALTER DATABASE.also supports recursive invocation of triggers when the RECURSIVE_TRIGGERS setting is enabled using ALTER DATABASE.

I trigger ricorsivi supportano i tipi di ricorsione seguenti:Recursive triggers enable the following types of recursion to occur:

  • Ricorsione indirettaIndirect recursion

    Quando viene utilizzata la ricorsione indiretta, un'applicazione aggiorna la tabella T1,With indirect recursion, an application updates table T1. il che attiva il trigger TR1 che aggiorna la tabella T2.This fires trigger TR1, updating table T2. Viene quindi attivato il trigger T2 che aggiorna la tabella T1.Trigger T2 then fires and updates table T1.

  • Ricorsione direttaDirect recursion

    Nella ricorsione diretta un'applicazione aggiorna la tabella T1,In direct recursion, the application updates table T1. il che attiva il trigger TR1 che aggiorna la tabella T1.This fires trigger TR1, updating table T1. Poiché la tabella T1 è stata aggiornata, viene di nuovo attivato il trigger TR1 e il processo viene quindi ripetuto.Because table T1 was updated, trigger TR1 fires again, and so on.

Nell'esempio seguente vengono utilizzati entrambi i tipi di ricorsione indiretta e diretta. Si supponga che per la tabella T1 vengano definiti due trigger di aggiornamento, TR1 e TR2.The following example uses both indirect and direct trigger recursion Assume that two update triggers, TR1 and TR2, are defined on table T1. Il trigger TR1 aggiorna in modo ricorsivo la tabella T1.Trigger TR1 updates table T1 recursively. Un'istruzione UPDATE esegue ogni trigger TR1 e TR2 una sola volta.An UPDATE statement runs each TR1 and TR2 one time. Inoltre, l'avvio di TR1 attiva l'esecuzione di TR1 in modo ricorsivo e di TR2.Additionally, the launch of TR1 triggers the execution of TR1 (recursively) and TR2. Le tabelle inserted e deleted per un trigger specifico includono solo le righe corrispondenti all'istruzione UPDATE che ha richiamato il trigger.The inserted and deleted tables for a specific trigger contain rows that correspond only to the UPDATE statement that invoked the trigger.

Nota

La sequenza illustrata nell'esempio precedente ha luogo solo quando viene abilitata l'impostazione RECURSIVE_TRIGGERS tramite ALTER DATABASE.The previous behavior occurs only if the RECURSIVE_TRIGGERS setting is enabled by using ALTER DATABASE. Non esiste un ordine prestabilito per l'esecuzione di più trigger definiti per un evento specifico.There's no defined order in which multiple triggers defined for a specific event are run. Ogni trigger deve essere autonomo.Each trigger should be self-contained.

La disabilitazione di RECURSIVE_TRIGGERS consente di evitare solo la ricorsione diretta.Disabling the RECURSIVE_TRIGGERS setting only prevents direct recursions. Per disabilitare anche la ricorsione indiretta, impostare l'opzione del server nested triggers su 0 utilizzando sp_configure.To disable indirect recursion also, set the nested triggers server option to 0 by using sp_configure.

Se un trigger esegue un'istruzione ROLLBACK TRANSACTION non vengono eseguiti altri trigger, indipendentemente dal livello di nidificazione.If any one of the triggers carries out a ROLLBACK TRANSACTION, regardless of the nesting level, no more triggers are run.

Trigger nidificatiNested Triggers

È possibile annidare i trigger fino a un massimo di 32 livelli.You can nest triggers to a maximum of 32 levels. Se un trigger modifica una tabella che include un altro trigger, viene attivato il secondo trigger, che può chiamare a sua volta un terzo trigger e così via.If a trigger changes a table on which there's another trigger, the second trigger activates and can then call a third trigger, and so on. Se un trigger della catena attiva un ciclo infinito, viene superato il livello massimo di nidificazione e il trigger viene annullato.If any trigger in the chain sets off an infinite loop, the nesting level is exceeded and the trigger is canceled. Quando un trigger Transact-SQLTransact-SQL avvia il codice gestito facendo riferimento a una routine, un tipo o una funzione di aggregazione CLR, questo riferimento viene conteggiato come un livello per il calcolo del limite di annidamento massimo pari a 32 livelli.When a Transact-SQLTransact-SQL trigger launches managed code by referencing a CLR routine, type, or aggregate, this reference counts as one level against the 32-level nesting limit. I metodi richiamati dal codice gestito non vengono inclusi nel conteggio per questo limite.Methods invoked from within managed code don't count against this limit.

Per disabilitare i trigger nidificati, impostare l'opzione nested triggers di sp_configure su 0 (off).To disable nested triggers, set the nested triggers option of sp_configure to 0 (off). La configurazione predefinita supporta i trigger annidati.The default configuration supports nested triggers. Quando i trigger annidati sono disattivati, vengono disabilitati anche i trigger ricorsivi, indipendentemente dall'impostazione RECURSIVE_TRIGGERS attivata usando ALTER DATABASE.If nested triggers are off, recursive triggers are also disabled, despite the RECURSIVE_TRIGGERS setting that's set by using ALTER DATABASE.

Il primo trigger AFTER annidato in un trigger INSTEAD OF viene attivato anche se l'opzione di configurazione del server nested triggers è 0,The first AFTER trigger nested inside an INSTEAD OF trigger fires even if the nested triggers server configuration option is 0. ma, con questa impostazione, i successivi trigger AFTER non vengono attivati.But, under this setting, the later AFTER triggers don't fire. Verificare la presenza di trigger annidati nelle applicazioni per determinare se le applicazioni seguono le regole business quando l'opzione di configurazione del server nested triggers è impostata su 0.Review your applications for nested triggers to determine if the applications follow your business rules when the nested triggers server configuration option is set to 0. In caso contrario, apportare le modifiche appropriate.If not, make the appropriate modifications.

Risoluzione dei nomi posticipataDeferred Name Resolution

In SQL ServerSQL Server è possibile includere all'interno di stored procedure, trigger e batch Transact-SQLTransact-SQL riferimenti a tabelle che non esistono in fase di compilazione.SQL ServerSQL Server allows for Transact-SQLTransact-SQL stored procedures, triggers, and batches to refer to tables that don't exist at compile time. Questa funzionalità è denominata risoluzione dei nomi posticipata.This ability is called deferred name resolution.

PermissionsPermissions

Per creare un trigger DML, è necessaria l'autorizzazione ALTER per la tabella o la vista in cui creare il trigger.To create a DML trigger, it requires ALTER permission on the table or view on which the trigger is being created.

Per creare un trigger DDL con ambito server (ON ALL SERVER) o un trigger LOGON, è necessaria l'autorizzazione CONTROL SERVER per il server.To create a DDL trigger with server scope (ON ALL SERVER) or a logon trigger, requires CONTROL SERVER permission on the server. Per creare un trigger DDL con ambito database (ON DATABASE), è necessaria l'autorizzazione ALTER ANY DATABASE DDL TRIGGER per il database corrente.To create a DDL trigger with database scope (ON DATABASE), requires ALTER ANY DATABASE DDL TRIGGER permission in the current database.

EsempiExamples

A.A. Utilizzo di un trigger DML con un messaggio di promemoriaUsing a DML trigger with a reminder message

Il trigger DML seguente visualizza un messaggio nel client quando un utente tenta di aggiungere o di modificare i dati nella tabella Customer del database AdventureWorks2012AdventureWorks2012.The following DML trigger prints a message to the client when anyone tries to add or change data in the Customer table in the AdventureWorks2012AdventureWorks2012 database.

CREATE TRIGGER reminder1  
ON Sales.Customer  
AFTER INSERT, UPDATE   
AS RAISERROR ('Notify Customer Relations', 16, 10);  
GO  

b.B. Utilizzo di un trigger DML con un messaggio di promemoria inviato tramite posta elettronicaUsing a DML trigger with a reminder e-mail message

Nell'esempio seguente viene inviato un messaggio di posta elettronica a un utente specificato (MaryM) quando viene apportata una modifica alla tabella Customer.The following example sends an e-mail message to a specified person (MaryM) when the Customer table changes.

CREATE TRIGGER reminder2  
ON Sales.Customer  
AFTER INSERT, UPDATE, DELETE   
AS  
   EXEC msdb.dbo.sp_send_dbmail  
        @profile_name = 'AdventureWorks2012 Administrator',  
        @recipients = 'danw@Adventure-Works.com',  
        @body = 'Don''t forget to print a report for the sales force.',  
        @subject = 'Reminder';  
GO  

C.C. Utilizzo di un trigger DML AFTER per applicare una regola business tra le tabelle PurchaseOrderHeader e VendorUsing a DML AFTER trigger to enforce a business rule between the PurchaseOrderHeader and Vendor tables

Poiché i vincoli CHECK fanno riferimento solo alle colonne in cui è definito il vincolo a livello di colonna o di tabella, è necessario definire come trigger qualsiasi vincolo tra tabelle, in questo caso le regole business.Because CHECK constraints reference only the columns on which the column-level or table-level constraint is defined, you must define any cross-table constraints (in this case, business rules) as triggers.

Nell'esempio seguente viene creato un trigger DML nel database AdventureWorks2012.The following example creates a DML trigger in the AdventureWorks2012 database. Questo trigger verifica che la posizione creditizia del fornitore sia buona (non 5) quando viene eseguito un tentativo di inserimento di un nuovo ordine di acquisto nella tabella PurchaseOrderHeader.This trigger checks to make sure the credit rating for the vendor is good (not 5) when there's an attempt to insert a new purchase order into the PurchaseOrderHeader table. Per ottenere la posizione creditizia del fornitore, è necessario fare riferimento alla tabella Vendor.To get the credit rating of the vendor, the Vendor table must be referenced. Se la posizione creditizia è troppo bassa, viene visualizzato un messaggio e l'operazione di inserimento non viene eseguita.If the credit rating is too low, a message appears and the insertion doesn't happen.

-- This trigger prevents a row from being inserted in the Purchasing.PurchaseOrderHeader 
-- table when the credit rating of the specified vendor is set to 5 (below average).  
  
CREATE TRIGGER Purchasing.LowCredit ON Purchasing.PurchaseOrderHeader  
AFTER INSERT  
AS  
IF (ROWCOUNT_BIG() = 0)
RETURN;
IF EXISTS (SELECT *  
           FROM Purchasing.PurchaseOrderHeader AS p   
           JOIN inserted AS i   
           ON p.PurchaseOrderID = i.PurchaseOrderID   
           JOIN Purchasing.Vendor AS v   
           ON v.BusinessEntityID = p.VendorID  
           WHERE v.CreditRating = 5  
          )  
BEGIN  
RAISERROR ('A vendor''s credit rating is too low to accept new  
purchase orders.', 16, 1);  
ROLLBACK TRANSACTION;  
RETURN   
END;  
GO  
  
-- This statement attempts to insert a row into the PurchaseOrderHeader table  
-- for a vendor that has a below average credit rating.  
-- The AFTER INSERT trigger is fired and the INSERT transaction is rolled back.  
  
INSERT INTO Purchasing.PurchaseOrderHeader (RevisionNumber, Status, EmployeeID,  
VendorID, ShipMethodID, OrderDate, ShipDate, SubTotal, TaxAmt, Freight)  
VALUES (  
2  
,3  
,261  
,1652  
,4  
,GETDATE()  
,GETDATE()  
,44594.55  
,3567.564  
,1114.8638 );  
GO  
  

D.D. Utilizzo di un trigger DDL con ambito databaseUsing a database-scoped DDL trigger

Nell'esempio seguente viene utilizzato un trigger DDL per impedire l'eliminazione di qualsiasi sinonimo in un database.The following example uses a DDL trigger to prevent any synonym in a database from being dropped.

CREATE TRIGGER safety   
ON DATABASE   
FOR DROP_SYNONYM  
AS   
IF (@@ROWCOUNT = 0)
RETURN;
   RAISERROR ('You must disable Trigger "safety" to drop synonyms!',10, 1)  
   ROLLBACK  
GO  
DROP TRIGGER safety  
ON DATABASE;  
GO  

E.E. Utilizzo di un trigger DDL con ambito serverUsing a server-scoped DDL trigger

Nell'esempio seguente viene utilizzato un trigger DDL per visualizzare un messaggio se si verifica un evento CREATE DATABASE nell'istanza del server corrente e viene utilizzata la funzione EVENTDATA per recuperare il testo dell'istruzione Transact-SQLTransact-SQL corrispondente.The following example uses a DDL trigger to print a message if any CREATE DATABASE event occurs on the current server instance, and uses the EVENTDATA function to retrieve the text of the corresponding Transact-SQLTransact-SQL statement. Per altri esempi di utilizzo di EVENTDATA nei trigger DDL, vedere Usare la funzione EVENTDATA.For more examples that use EVENTDATA in DDL triggers, see Use the EVENTDATA Function.

Si applica a: SQL Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

CREATE TRIGGER ddl_trig_database   
ON ALL SERVER   
FOR CREATE_DATABASE   
AS   
    PRINT 'Database Created.'  
    SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')  
GO  
DROP TRIGGER ddl_trig_database  
ON ALL SERVER;  
GO  

F.F. Utilizzo di un trigger LOGONUsing a logon trigger

Nell'esempio seguente di trigger LOGON viene negato il tentativo di accesso a SQL ServerSQL Server come membro dell'account di accesso login_test se esistono già tre sessioni utente in esecuzione con tale account di accesso.The following logon trigger example denies an attempt to log in to SQL ServerSQL Server as a member of the login_test login if there are already three user sessions running under that login.

Si applica a: SQL Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

USE master;  
GO  
CREATE LOGIN login_test WITH PASSWORD = '3KHJ6dhx(0xVYsdf' MUST_CHANGE,  
    CHECK_EXPIRATION = ON;  
GO  
GRANT VIEW SERVER STATE TO login_test;  
GO  
CREATE TRIGGER connection_limit_trigger  
ON ALL SERVER WITH EXECUTE AS 'login_test'  
FOR LOGON  
AS  
BEGIN  
IF ORIGINAL_LOGIN()= 'login_test' AND  
    (SELECT COUNT(*) FROM sys.dm_exec_sessions  
            WHERE is_user_process = 1 AND  
                original_login_name = 'login_test') > 3  
    ROLLBACK;  
END;  
  

G.G. Visualizzazione degli eventi che attivano un triggerViewing the events that cause a trigger to fire

Nell'esempio seguente viene eseguita una query sulle viste del catalogo sys.triggers e sys.trigger_events per determinare gli eventi del linguaggio Transact-SQLTransact-SQL che attivano il trigger safety.The following example queries the sys.triggers and sys.trigger_events catalog views to determine which Transact-SQLTransact-SQL language events cause trigger safety to fire. Il trigger, safety, viene creato nell'esempio 'D' sopra riportato.The trigger, safety, is created in example 'D', found above.

SELECT TE.*  
FROM sys.trigger_events AS TE  
JOIN sys.triggers AS T ON T.object_id = TE.object_id  
WHERE T.parent_class = 0 AND T.name = 'safety';  
GO  

Vedere ancheSee Also

ALTER TABLE (Transact-SQL) ALTER TABLE (Transact-SQL)
ALTER TRIGGER (Transact-SQL) ALTER TRIGGER (Transact-SQL)
COLUMNS_UPDATED (Transact-SQL) COLUMNS_UPDATED (Transact-SQL)
CREATE TABLE (Transact-SQL) CREATE TABLE (Transact-SQL)
DROP TRIGGER (Transact-SQL) DROP TRIGGER (Transact-SQL)
ENABLE TRIGGER (Transact-SQL) ENABLE TRIGGER (Transact-SQL)
DISABLE TRIGGER (Transact-SQL) DISABLE TRIGGER (Transact-SQL)
TRIGGER_NESTLEVEL (Transact-SQL) TRIGGER_NESTLEVEL (Transact-SQL)
EVENTDATA (Transact-SQL) EVENTDATA (Transact-SQL)
sys.dm_sql_referenced_entities (Transact-SQL) sys.dm_sql_referenced_entities (Transact-SQL)
sys.dm_sql_referencing_entities (Transact-SQL) sys.dm_sql_referencing_entities (Transact-SQL)
sys.sql_expression_dependencies (Transact-SQL) sys.sql_expression_dependencies (Transact-SQL)
sp_help (Transact-SQL) sp_help (Transact-SQL)
sp_helptrigger (Transact-SQL) sp_helptrigger (Transact-SQL)
sp_helptext (Transact-SQL) sp_helptext (Transact-SQL)
sp_rename (Transact-SQL) sp_rename (Transact-SQL)
sp_settriggerorder (Transact-SQL) sp_settriggerorder (Transact-SQL)
UPDATE() (Transact-SQL) UPDATE() (Transact-SQL)
Ottieni informazioni sui trigger DML Get Information About DML Triggers
Ottenere informazioni sui trigger DDL Get Information About DDL Triggers
sys.triggers (Transact-SQL) sys.triggers (Transact-SQL)
sys.trigger_events (Transact-SQL) sys.trigger_events (Transact-SQL)
sys.sql_modules (Transact-SQL) sys.sql_modules (Transact-SQL)
sys.assembly_modules (Transact-SQL) sys.assembly_modules (Transact-SQL)
sys.server_triggers (Transact-SQL) sys.server_triggers (Transact-SQL)
sys.server_trigger_events (Transact-SQL) sys.server_trigger_events (Transact-SQL)
sys.server_sql_modules (Transact-SQL) sys.server_sql_modules (Transact-SQL)
sys.server_assembly_modules (Transact-SQL)sys.server_assembly_modules (Transact-SQL)