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

QUESTO ARGOMENTO SI APPLICA A:sìSQL Server (a partire dalla versione 2008)sìDatabase SQL di AzurenoAzure SQL Data Warehouse noParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Crea un trigger DML, DDL o LOGON.Creates a DML, DDL, or logon trigger. Un trigger è un tipo speciale di stored procedure che viene eseguita automaticamente quando si verifica un evento nel server di database.A trigger is a special kind of stored procedure that automatically executes when an event occurs in the database server. I trigger DML vengono eseguiti quando un utente tenta di modificare dati tramite un evento DML (Data Manipulation Language).DML triggers execute 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 esistano o meno righe di tabella interessate.These triggers fire when any valid event is fired, regardless of whether or not any table rows are affected. 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 execute 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 is raised when a user sessions is being established. I trigger possono essere creati direttamente dalle Transact-SQLTransact-SQL istruzioni o uno dei metodi di assembly creati nel MicrosoftMicrosoft .NET Framework.NET Framework common language runtime (CLR) e caricati in un'istanza di SQL ServerSQL Server.Triggers can be created 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 la creazione di più trigger per qualsiasi istruzione specifica. allows for creating 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 ulteriori informazioni su come contrastare questa minaccia, vedere Gestisci sicurezza Trigger.For more information on how to mitigate this threat, see Manage Trigger Security.

Nota

Integrazione di CLR di .NET Framework in SQL Server viene illustrata in questo argomento.The integration of .NET Framework CLR into SQL Server is discussed in this topic. Integrazione con CLR non si applica al Database SQL 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

-- Windows 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 ]  
-- Windows 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

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

Consente di modificare il trigger in modo condizionale 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.Is 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 i trigger stessi creati.DML triggers are scoped to the schema of the table or view on which they are created. schema_name non può essere specificato per i trigger DDL o logon.schema_name cannot be specified for DDL or logon triggers.

trigger_nametrigger_name
Nome del trigger.Is the name of the trigger. Oggetto trigger_name devono essere conformi alle regole per identificatori, ad eccezione del fatto che trigger_name non può iniziare con # o # #.A trigger_name must comply with the rules for identifiers, except that trigger_name cannot start with # or ##.

tabella | visualizzazionetable | view
Tabella o vista in cui viene eseguito il trigger DML, talvolta denominata tabella di trigger o vista di trigger.Is the table or view on which the DML trigger is executed and 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. I riferimenti alle viste possono essere utilizzati solo in trigger INSTEAD OF.A view can be referenced only by an INSTEAD OF trigger. Non è possibile definire trigger DML in tabelle temporanee globali o locali.DML triggers cannot be defined 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 specificato, il trigger viene attivato ogni volta che event_type o event_group si verifica 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 specificato, il trigger viene attivato ogni volta che event_type o event_group si verifica in un punto qualsiasi 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.

Esegue l'offuscamento del testo dell'istruzione CREATE TRIGGER.Obfuscates 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 cannot 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 con ottimizzazione per la memoria.This option is required for triggers on memory-optimized tables.

Per ulteriori informazioni, vedereclausola EXECUTE AS ( Transact-SQL ) .For more information, seeEXECUTE AS Clause (Transact-SQL).

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

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

SCHEMABINDINGSCHEMABINDING
Assicura che le tabelle a cui fa riferimento un trigger non possono essere eliminate o modificate.Ensures that tables that are referenced by a trigger cannot be dropped or altered.

Questa opzione è necessaria per i trigger sulle tabelle con ottimizzazione per la memoria e non è supportata per i trigger sulle tabelle tradizionali.This option is required for triggers on memory-optimized tables and is not supported for triggers on traditional tables.

FOR | AFTERFOR | AFTER
AFTER specifica che il trigger DML viene attivato solo al termine dell'esecuzione di tutte le operazioni specificate nell'istruzione di trigger SQL.AFTER specifies that the DML trigger is fired only when all operations specified in the triggering SQL statement have executed successfully. Affinché il trigger venga attivato, è inoltre necessario che siano stati completati tutti i controlli dei vincoli e le operazioni referenziali di propagazione.All referential cascade actions and constraint checks also must 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 AFTER per le viste.AFTER triggers cannot be defined on views.

INSTEAD OFINSTEAD OF
Specifica che viene eseguito il trigger DML anziché l'istruzione di trigger SQL, pertanto, si esegue l'override delle azioni delle istruzioni di trigger.Specifies that the DML trigger is executed instead of the triggering SQL statement, therefore, overriding the actions of the triggering statements. Non è possibile specificare INSTEAD OF per i trigger DDL o LOGON.INSTEAD OF cannot be specified 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, one INSTEAD OF trigger per INSERT, UPDATE, or DELETE statement can be defined on a table or view. È tuttavia possibile definire viste che fanno riferimento ad altre viste. Ogni vista include un trigger INSTEAD OF.However, you can define views on views where each view has its own INSTEAD OF trigger.

I trigger INSTEAD OF non sono consentiti in viste aggiornabili che utilizzano WITH CHECK OPTION.INSTEAD OF triggers are not allowed on updatable views that use WITH CHECK OPTION. Se un trigger INSTEAD OF viene aggiunto a una vista aggiornabile per la quale è stato specificato WITH CHECK OPTION, in SQL ServerSQL Server viene generato un errore. SQL ServerSQL Server raises an error when an INSTEAD OF trigger is added to an updatable view WITH CHECK OPTION specified. Per poter definire il trigger INSTEAD OF, è prima necessario rimuovere l'opzione tramite l'istruzione ALTER VIEW.The user must 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 is tried against this table or view. È necessario specificare almeno un'opzione.At least one option must be specified. Nella definizione di trigger è consentita qualsiasi combinazione delle opzioni nell'ordine desiderato.Any combination of these options in any order is allowed in the trigger definition.

Per i trigger INSTEAD OF, l'opzione DELETE non è consentita in tabelle contenenti una relazione referenziale che specifica un'operazione di propagazione ON DELETE.For INSTEAD OF triggers, the DELETE option is not allowed 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 is not 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 utilizzata con trigger INSTEAD OF o quando il trigger AFTER viene dichiarato in modo esplicito.WITH APPEND cannot be used with INSTEAD OF triggers or if AFTER trigger is explicitly stated. È possibile utilizzare la clausola WITH APPEND solo quando viene specificata la parola chiave FOR, senza INSTEAD OF o AFTER, per motivi di compatibilità con le versioni precedenti.WITH APPEND can be used only when FOR is specified, without INSTEAD OF or AFTER, for backward compatibility reasons. Quando viene specificata la clausola EXTERNAL NAME, ovvero se si tratta di un trigger CLR, la clausola WITH APPEND non può essere utilizzata.WITH APPEND cannot be specified if EXTERNAL NAME is specified (that is, if the trigger is a CLR trigger).

event_typeevent_type
Nome di un evento del linguaggio Transact-SQLTransact-SQL che, dopo l'esecuzione, attiva un trigger DDL.Is the name of a Transact-SQLTransact-SQL language event that, after execution, causes a DDL trigger to fire. Sono elencati gli eventi validi per i trigger DDL 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.Is the name of a predefined grouping of Transact-SQLTransact-SQL language events. Il trigger DDL viene attivato dopo l'esecuzione di qualsiasi Transact-SQLTransact-SQL evento del linguaggio a cui appartiene event_group.The DDL trigger fires after execution of any Transact-SQLTransact-SQL language event that belongs to event_group. Gruppi di eventi valido per i trigger DDL sono elencati in gruppi di eventi DDL.Valid event groups for DDL triggers are listed in DDL Event Groups.

Al termine dell'esecuzione di CREATE TRIGGER event_group funge anche da macro aggiungendo i tipi di evento 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 should not be executed when a replication agent modifies the table that is involved in the trigger.

sql_statementsql_statement
Condizioni e azioni del trigger.Is the trigger conditions and actions. Le condizioni del trigger specificano ulteriori criteri che determinano se gli eventi DML, DDL o LOGON che si tenta di 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 performed.

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 kind 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 not return data to the user. Il Transact-SQLTransact-SQL le istruzioni in un trigger spesso includono language del flusso di controllo.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 tenta di eseguire l'azione utente.They are 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 ulteriori informazioni, vedere utilizzare le tabelle inserted e deleted.For more information, see Use the inserted and deleted Tables.

Trigger DDL e logon acquisiscono informazioni sull'evento di attivazione tramite il EVENTDATA ( Transact-SQL ) (funzione).DDL and logon triggers capture information about the triggering event by using the EVENTDATA (Transact-SQL) function. Per ulteriori informazioni, vedere utilizzo della funzione EVENTDATA.For more information, see Use the EVENTDATA Function.

SQL ServerSQL ServerConsente l'aggiornamento di testo, ntext, o immagine attivano colonne tramite INSTEAD OF in tabelle o viste. allows for the update of text, ntext, or image columns through the INSTEAD OF trigger on tables or views.

Importante

ntext, testo, e immagine tipi di dati verranno rimossa in una versione futura di MicrosoftMicrosoft SQL ServerSQL Server.ntext, text, and image data types will be removed in a future version of MicrosoftMicrosoft SQL 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. Trigger sia AFTER e INSTEAD OF supportano varchar (max), nvarchar (max), e varbinary (max) dati 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 con ottimizzazione per la memoria, l'unico sql_statement consentite al livello superiore è un blocco atomico.For triggers on memory-optimized tables, the only sql_statement allowed at the top level is an ATOMIC block. T-SQL consentite all'interno del blocco atomico è limitato da T-SQL consentite all'interno delle 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: SQL Server 2008SQL Server 2008 tramite 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 valore valido SQL ServerSQL Server identificatore 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 cannot 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 e rilasciare gli oggetti di database che fanno riferimento a moduli di codice gestito, ma tali riferimenti non verranno eseguiti in un'istanza di SQL ServerSQL Server , a meno che il opzione clr enabled abilitata utilizzando sp _ configurare.You can create, modify, and drop database objects that reference managed code modules, but these references will not execute in an instance of SQL ServerSQL Server unless the clr enabled Option is enabled by using sp_configure.

La sezione Osservazioni di trigger DMLRemarks 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 does not 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 are checked after the INSTEAD OF trigger execution and before the AFTER trigger execution. 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 is not fired.

È possibile specificare il primo e l'ultimo trigger AFTER che si desidera eseguire in una tabella utilizzando sp_settriggerorder.The first and last AFTER triggers to be executed on a table can be specified 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.Only one first and one last AFTER trigger for each INSERT, UPDATE, and DELETE operation can be specified 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 are randomly executed.

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 the order value must be reset by using sp_settriggerorder.

Un trigger AFTER viene eseguito solo dopo il completamento dell'esecuzione dell'istruzione SQL di attivazione,An AFTER trigger is executed only after the triggering SQL statement has executed 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. Tramite il trigger AFTER non verrà generato in modo ricorsivo un trigger INSTEAD OF nella stessa tabella.An AFTER trigger will 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 executes a statement against the table that would ordinarily fire the INSTEAD OF trigger again, the trigger is not 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 is processed as if the table had no INSTEAD OF trigger and starts the chain of constraint operations and AFTER trigger executions. Se, ad esempio, per una tabella viene definito un trigger INSTEAD OF INSERT che esegue un'istruzione INSERT sulla stessa tabella, l'istruzione INSERT eseguita dal trigger INSTEAD OF non comporta una nuova chiamata del trigger.For example, if a trigger is defined as an INSTEAD OF INSERT trigger for a table, and the trigger executes an INSERT statement on the same table, the INSERT statement executed by the INSTEAD OF trigger does not call the trigger again. L'istruzione INSERT eseguita 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 executed by the trigger starts the process of performing constraint actions and firing any AFTER INSERT triggers defined for the table.

Se 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.If an INSTEAD OF trigger defined on a view executes a statement against the view that would ordinarily fire the INSTEAD OF trigger again, it is 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 dati tramite una vista.For a definition of updatable views, see Modify Data Through a View.

Se, ad esempio, per una vista viene definito un trigger INSTEAD OF UPDATE che esegue un'istruzione UPDATE che fa riferimento alla stessa vista, l'istruzione UPDATE eseguita dal trigger INSTEAD OF non comporta una nuova chiamata del trigger.For example, if a trigger is defined as an INSTEAD OF UPDATE trigger for a view, and the trigger executes an UPDATE statement referencing the same view, the UPDATE statement executed by the INSTEAD OF trigger does not call the trigger again. L'istruzione UPDATE eseguita dal trigger viene elaborata rispetto alla vista come se la vista non includesse un trigger INSTEAD OF.The UPDATE executed by the trigger is processed against the view as if the view did not 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 perform certain actions based on UPDATE or INSERT modifications to specific columns. Utilizzare Update () o COLUMNS_UPDATED nel corpo del trigger a questo scopo.Use UPDATE() or COLUMNS_UPDATED in the body of the trigger for this purpose. UPDATE() consente di verificare i tentativi di esecuzione di UPDATE o INSERT su una colonna.UPDATE() tests for UPDATE or INSERT tries on one column. COLUMNS_UPDATED consente di verificare operazioni UPDATE o INSERT eseguite su più colonne e restituisce uno schema di bit che indica le colonne inserite o aggiornate.COLUMNS_UPDATED tests for UPDATE or INSERT actions that are performed on multiple columns and 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 cannot 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 having results returned to an application because of a trigger firing, do not include either SELECT statements that return results or statements that perform variable assignment in a trigger. Un trigger contenente istruzioni SELECT che restituiscono risultati all'utente o istruzioni che eseguono assegnazioni di variabili richiede una gestione particolare. I risultati restituiti devono essere gestiti in ogni applicazione in cui sono consentite modifiche alla tabella di trigger.A trigger that includes either SELECT statements that return results to the user or statements that perform variable assignment requires special handling; these returned results would have to be written 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 in quanto tramite l'operazione non vengono registrate singole eliminazioni di righe.Although a TRUNCATE TABLE statement is in effect a DELETE statement, it does not activate a trigger because the operation does not log individual row deletions. Solo gli utenti che dispongono delle 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 execute 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, does not activate a trigger.

Le istruzioni Transact-SQLTransact-SQL seguenti non sono consentite in un trigger DML:The following Transact-SQLTransact-SQL statements are not 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 possono essere utilizzate 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 are not allowed inside the body of a DML trigger when it is used against the table or view that is 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.

La sezione Osservazioni di trigger DDLRemarks DDL Triggers

I trigger DDL, analogamente ai trigger standard, eseguono stored procedure in risposta a un evento.DDL triggers, like standard triggers, execute 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 do not execute 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 execute in response to data definition language (DDL) statements. incluse istruzioni CREATE, ALTER, DROP, GRANT, DENY, REVOKE e UPDATE STATISTICS.These include CREATE, ALTER, DROP, GRANT, DENY, REVOKE, and UPDATE STATISTICS statements. Alcune stored procedure di sistema che eseguono operazioni di tipo DDL possono inoltre attivare trigger DDL.Certain system stored procedures that perform 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 will fire a DDL trigger that is created on a CREATE_TYPE event.

Per ulteriori 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 do not 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 are not scoped to schemas. Pertanto, non è possibile utilizzare funzioni quali OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY e OBJECTPROPERTYEX durante l'esecuzione di query sui metadati relativi ai trigger DDL.Therefore, functions such as OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY, and OBJECTPROPERTYEX cannot be used for querying metadata about DDL triggers. Utilizzare in alternativa le viste del catalogo.Use the catalog views instead. Per ulteriori informazioni, vedere ottenere informazioni sui trigger DDL.For more information, see Get Information About DDL Triggers.

Nota

Trigger DDL con ambito server vengono visualizzati di SQL Server Management StudioSQL Server Management Studio Esplora oggetti nel trigger cartella.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. Trigger DDL con ambito database vengono visualizzati di trigger di Database cartella.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 consentono di eseguire stored procedure in risposta a un evento LOGONLogon triggers execute stored procedures in response to a LOGON event. generato quando viene stabilita una sessione utente a un'istanza di SQL ServerSQL Server.This event is raised 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 effettivamente stabilita.Logon triggers fire after the authentication phase of logging in finishes, but before the user session is actually established. Per questo motivo, 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 .Therefore, 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 ulteriori 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 do not fire if authentication fails.

In un trigger LOGON non sono supportate transazioni distribuite.Distributed transactions are not supported in a logon trigger. Quando viene attivato un trigger LOGON contenente una transazione distribuita, viene restituito l'errore 3969.Error 3969 is returned when a logon trigger containing a distributed transaction is fired.

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 are not 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 this. Per impedire che i trigger restituiscano set di risultati, impostare il impostazione disallow results from triggers-opzione 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 results sets to be returned and this behavior is not configurable. Se un trigger LOGON genera un set di risultati, l'esecuzione del trigger ha esito negativo e viene negato il tentativo di accesso che ha attivato il trigger.If a logon trigger does generate a result set, the trigger fails to execute and the login attempt that fired the trigger is denied.

Più triggerMultiple Triggers

In SQL ServerSQL Server è possibile creare più trigger per ogni evento DML, DDL o LOGON. SQL ServerSQL Server allows for multiple triggers to be created for each DML, DDL, or LOGON event. Se, ad esempio, viene eseguita l'istruzione CREATE TRIGGER FOR UPDATE per una tabella che dispone già di un trigger UPDATE, viene creato un ulteriore trigger di aggiornamento.For example, if CREATE TRIGGER FOR UPDATE is executed 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 inoltre chiamate ricorsive di trigger quando viene abilitata l'impostazione RECURSIVE_TRIGGERS tramite ALTER DATABASE. also allows for 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. In uno scenario di questo tipo viene quindi attivato il trigger T2 che aggiorna la tabella T1.In this scenario, trigger T2 then fires and updates table T1.

  • Ricorsione direttaDirect recursion

    Quando viene utilizzata la ricorsione diretta, un'applicazione aggiorna la tabella T1,With 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 executes each TR1 and TR2 one time. Inoltre, l'esecuzione di TR1 attiva l'esecuzione di TR1 in modo ricorsivo e di TR2.Additionally, the execution 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 is no defined order in which multiple triggers defined for a specific event are executed. 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 performs a ROLLBACK TRANSACTION, regardless of the nesting level, no more triggers are executed.

Trigger nidificatiNested Triggers

I trigger possono essere nidificati fino a un massimo di 32 livelli.Triggers can be nested 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 is another trigger, the second trigger is activated 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 esegue 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 nidificazione massimo pari a 32 livelli.When a Transact-SQLTransact-SQL trigger executes 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 da codice gestito non vengono inclusi nel conteggio per questo limiteMethods invoked from within managed code do not 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). Per impostazione predefinita, i trigger nidificati sono consentiti.The default configuration allows for nested triggers. Quando si imposta su off l'opzione relativa ai trigger nidificati, vengono disabilitati anche i trigger ricorsivi, indipendentemente dall'impostazione RECURSIVE_TRIGGERS attivata tramite ALTER DATABASE.If nested triggers is off, recursive triggers is also disabled, regardless of the RECURSIVE_TRIGGERS setting set by using ALTER DATABASE.

Il primo trigger AFTER nidificato in un trigger INSTEAD OF viene attivato anche se il trigger nidificati opzione di configurazione del server è impostato su 0.The first AFTER trigger nested inside an INSTEAD OF trigger fires even if the nested triggers server configuration option is set to 0. Tuttavia, con questa impostazione, i successivi trigger AFTER non vengono attivati.However, under this setting, later AFTER triggers do not fire. Si consiglia di esaminare le applicazioni presenti trigger nidificati determinare se le applicazioni sono conformi alle regole business in relazione a questo comportamento quando il trigger nidificati opzione di configurazione del server è impostata su 0, e quindi apportare le modifiche appropriate.We recommend that you review your applications for nested triggers to determine whether the applications comply with your business rules with regard to this behavior when the nested triggers server configuration option is set to 0, and then make 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 do not exist at compile time. Questa funzionalità è denominata risoluzione dei nomi posticipata.This ability is called deferred name resolution.

PermissionsPermissions

Per creare un trigger DML, è necessario disporre dell'autorizzazione ALTER per la tabella o la vista in cui si desidera creare il trigger.To create a DML trigger 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), è necessario disporre dell'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 possono fare 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 can reference only the columns on which the column-level or table-level constraint is defined, any cross-table constraints (in this case, business rules) must be defined 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 per accertarsi che la posizione creditizia del fornitore sia buona (non 5) quando viene effettuato un tentativo di inserire un nuovo ordine di acquisto nel PurchaseOrderHeader tabella.This trigger checks to make sure the credit rating for the vendor is good (not 5) when an attempt is made to insert a new purchase order into the PurchaseOrderHeader table. Per ottenere la posizione creditizia del fornitore, è necessario fare riferimento alla tabella Vendor.To obtain 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 is displayed and the insertion does not execute.

-- 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 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   
   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 ulteriori esempi di utilizzo di EVENTDATA nei trigger DDL, vedere utilizzo della 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 viene trigger di accesso negato il tentativo di accedere a SQL ServerSQL Server come membro del login_test account di accesso 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. safety è stato creato nell'esempio precedente.safety is created in the previous example.

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)
AGGIORNAMENTO ( ) ( 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)