Trigger DMLDML Triggers

Un trigger DML è un tipo speciale di stored procedure che diventa effettiva automaticamente quando viene eseguito un evento del linguaggio DML (Data Manipulation Language) che influisce sulla vista o tabella definita nel trigger.DML triggers is a special type of stored procedure that automatically takes effect when a data manipulation language (DML) event takes place that affects the table or view defined in the trigger. Gli eventi DML includono istruzioni INSERT, UPDATE o DELETE.DML events include INSERT, UPDATE, or DELETE statements. I trigger DML possono essere utilizzati per applicare regole business e l'integrità dei dati, eseguire query su altre tabelle e includere istruzioni Transact-SQLTransact-SQL complesse.DML triggers can be used to enforce business rules and data integrity, query other tables, and include complex Transact-SQLTransact-SQL statements. Il trigger e l'istruzione che lo attiva vengono considerati come una singola transazione, di cui è possibile eseguire il rollback dal trigger stesso.The trigger and the statement that fires it are treated as a single transaction, which can be rolled back from within the trigger. Se viene rilevato un errore grave, ad esempio un'insufficienza di spazio su disco, viene eseguito automaticamente il rollback dell'intera transazione.If a severe error is detected (for example, insufficient disk space), the entire transaction automatically rolls back.

Vantaggi del trigger DMLDML Trigger Benefits

I trigger DML sono simili ai vincoli in quanto sono in grado di applicare l'integrità di entità o di dominio.DML triggers are similar to constraints in that they can enforce entity integrity or domain integrity. L'integrità di entità dovrebbe essere sempre applicata al livello più basso utilizzando indici che fanno parte dei vincoli PRIMARY KEY e UNIQUE oppure creati indipendentemente dai vincoli.In general, entity integrity should always be enforced at the lowest level by indexes that are part of PRIMARY KEY and UNIQUE constraints or are created independently of constraints. Per applicare l'integrità di dominio è consigliabile utilizzare i vincoli CHECK, mentre per applicare l'integrità referenziale (RI) è consigliabile utilizzare i vincoli FOREIGN KEY.Domain integrity should be enforced through CHECK constraints, and referential integrity (RI) should be enforced through FOREIGN KEY constraints. I trigger DML sono particolarmente utili quando le caratteristiche supportate dai vincoli non sono in grado di soddisfare le esigenze funzionali dell'applicazione.DML triggers are most useful when the features supported by constraints cannot meet the functional needs of the application.

Nell'elenco seguente i trigger DML vengono confrontati con i vincoli e vengono identificati i casi in cui i trigger DML presentano vantaggi rispetto ai vincoli.The following list compares DML triggers with constraints and identifies when DML triggers have benefits over .

  • I trigger DML consentono di propagare le modifiche nelle tabelle correlate del database, tuttavia è possibile eseguire le modifiche in modo più efficiente utilizzando vincoli di integrità referenziale di propagazione.DML triggers can cascade changes through related tables in the database; however, these changes can be executed more efficiently using cascading referential integrity constraints. I vincoli FOREIGN KEY consentono di convalidare un valore di colonna soltanto se corrisponde esattamente al valore di un'altra colonna, a meno che la clausola REFERENCES non definisca un'operazione referenziale di propagazione.FOREIGN KEY constraints can validate a column value only with an exact match to a value in another column, unless the REFERENCES clause defines a cascading referential action.

  • Assicurano la protezione contro operazioni INSERT, UPDATE e DELETE dannose o non corrette e applicano altre restrizioni più complesse rispetto a quelle definite con i vincoli CHECK.They can guard against malicious or incorrect INSERT, UPDATE, and DELETE operations and enforce other restrictions that are more complex than those defined with CHECK constraints.

    A differenza dei vincoli CHECK, i trigger DML possono fare riferimento alle colonne di altre tabelle.Unlike CHECK constraints, DML triggers can reference columns in other tables. Un trigger, ad esempio, può utilizzare un'istruzione SELECT di un'altra tabella per eseguire il confronto con i dati inseriti o aggiornati e per eseguire ulteriori operazioni, ad esempio la modifica di dati o la visualizzazione di un messaggio di errore definito dall'utente.For example, a trigger can use a SELECT from another table to compare to the inserted or updated data and to perform additional actions, such as modify the data or display a user-defined error message.

  • Consentono di valutare lo stato di una tabella prima e dopo la modifica dei dati e di eseguire le operazioni appropriate sulla base delle differenze.They can evaluate the state of a table before and after a data modification and take actions based on that difference.

  • Più trigger DML dello stesso tipo (INSERT, UPDATE o DELETE) in una tabella consentono di eseguire più operazioni diverse in risposta alla stessa istruzione di modifica.Multiple DML triggers of the same type (INSERT, UPDATE, or DELETE) on a table allow multiple, different actions to take place in response to the same modification statement.

  • I vincoli sono in grado di segnalare errori soltanto tramite messaggi di errore standard di sistema.Constraints can communicate about errors only through standardized system error messages. Se nell'applicazione è necessario o consigliabile utilizzare messaggi personalizzati e gestire gli errori in modo più complesso, è necessario utilizzare un trigger.If your application requires, or can benefit from, customized messages and more complex error handling, you must use a trigger.

  • I trigger DML impediscono di apportare modifiche che violano l'integrità referenziale o consentono di eseguirne il rollback, annullando in tal modo il tentativo di modifica dei dati.DML triggers can disallow or roll back changes that violate referential integrity, thereby canceling the attempted data modification. Un trigger di questo tipo potrebbe essere attivato quando si modifica una chiave esterna e il nuovo valore non corrisponde alla chiave primaria.Such a trigger might go into effect when you change a foreign key and the new value does not match its primary key. A questo scopo tuttavia vengono normalmente utilizzati i vincoli FOREIGN KEY.However, FOREIGN KEY constraints are usually used for this purpose.

  • Gli eventuali vincoli inclusi nella tabella di trigger vengono verificati 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 but prior to 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 eseguito.If the constraints are violated, the INSTEAD OF trigger actions are rolled back and the AFTER trigger is not executed.

Tipi di trigger DMLTypes of DML Triggers

Trigger AFTERAFTER trigger
I trigger AFTER vengono eseguiti dopo l'esecuzione dell'azione associata all'istruzione INSERT, UPDATE, MERGE o DELETE.AFTER triggers are executed after the action of the INSERT, UPDATE, MERGE, or DELETE statement is performed. I trigger AFTER non vengono mai eseguiti sei si verifica una violazione di un vincolo, pertanto non possono essere utilizzati per elaborazioni che potrebbero impedire violazioni dei vincoli.AFTER triggers are never executed if a constraint violation occurs; therefore, these triggers cannot be used for any processing that might prevent constraint violations. Per ogni istruzione INSERT, UPDATE o DELETE specificata in un'istruzione MERGE, viene generato il trigger corrispondente per ogni operazione DML.For every INSERT, UPDATE, or DELETE action specified in a MERGE statement, the corresponding trigger is fired for each DML operation.

Trigger INSTEAD OFINSTEAD OF trigger
I trigger INSTEAD OF sostituiscono le azioni standard dell'istruzione di trigger.INSTEAD OF triggers override the standard actions of the triggering statement. È pertanto possibile definire un trigger per eseguire il controllo degli errori o dei valori in una o più colonne e quindi eseguire ulteriori azioni prima di inserire, aggiornare o eliminare la riga o le righe.Therefore, they can be used to perform error or value checking on one or more columns and the perform additional actions before insert, updating or deleting the row or rows. Quando, ad esempio, quando il valore aggiornato in una colonna relativa alla paga oraria in una tabella degli stipendi supera un valore specificato, è possibile definire un trigger per generare un messaggio di errore ed eseguire il rollback della transazione oppure inserire un nuovo record in un itinerario di controllo prima di inserire il record nella tabella degli stipendi.For example, when the value being updated in an hourly wage column in a payroll table exceeds a specified value, a trigger can be defined to either produce an error message and roll back the transaction, or insert a new record into an audit trail before inserting the record into the payroll table. Il vantaggio principale dei trigger INSTEAD OF consiste nel fatto che consentono alle viste non aggiornabili di supportare gli aggiornamenti.The primary advantage of INSTEAD OF triggers is that they enable views that would not be updatable to support updates. Una vista basata su più tabelle di base, ad esempio, deve utilizzare un trigger INSTEAD OF per supportare inserimenti, aggiornamenti ed eliminazioni che fanno riferimento a dati inclusi in più tabelle.For example, a view based on multiple base tables must use an INSTEAD OF trigger to support inserts, updates, and deletes that reference data in more than one table. Un altro vantaggio dei trigger INSTEAD OF è rappresentato dal fatto che consentono di scrivere il codice in modo da rifiutare parti di un batch accettandone altre.Another advantage of INSTEAD OF triggers is that they enable you to code logic that can reject parts of a batch while letting other parts of a batch to succeed.

Nella tabella seguente è riportato un confronto tra le funzionalità dei trigger AFTER e INSTEAD OF.This table compares the functionality of the AFTER and INSTEAD OF triggers.

FunzioneFunction Trigger AFTERAFTER trigger Trigger INSTEAD OFINSTEAD OF trigger
ApplicabilitàApplicability TabelleTables Tabelle e visteTables and views
Quantità per tabella o vistaQuantity per table or view Multiplo per azione di trigger (UPDATE, DELETE e INSERT)Multiple per triggering action (UPDATE, DELETE, and INSERT) Singolo per azione di trigger (UPDATE, DELETE e INSERT)One per triggering action (UPDATE, DELETE, and INSERT)
Riferimenti di propagazioneCascading references Nessuna restrizioneNo restrictions apply I trigger INSTEAD OF UPDATE e DELETE non sono consentiti in tabelle che rappresentano le destinazioni di vincoli di integrità per operazioni referenziali di propagazioneINSTEAD OF UPDATE and DELETE triggers are not allowed on tables that are targets of cascaded referential integrity constraints.
EsecuzioneExecution Dopo:After:

Elaborazione dei vincoliConstraint processing

Operazioni referenziali dichiarativeDeclarative referential actions

Creazione di tabelleinserted e deleted inserted and deleted tables creation

Operazione di triggerThe triggering action
Prima: elaborazione dei vincoliBefore: Constraint processing

Invece di: operazione di triggerIn place of: The triggering action

Dopo: creazione di tabelle inserted e deletedAfter: inserted and deleted tables creation
Ordine di esecuzioneOrder of execution È possibile specificare la prima e l'ultima esecuzioneFirst and last execution may be specified Non applicabileNot applicable
Riferimenti a colonnevarchar (max), nvarchar (max)e varbinary (max) in tabelle inserted e deleted varchar(max), nvarchar(max), and varbinary(max) column references in inserted and deleted tables AllowedAllowed AllowedAllowed
Riferimenti a colonnetext, ntexte image in tabelle inserted e deleted text, ntext, and image column references in inserted and deleted tables Non consentitiNot allowed AllowedAllowed

Trigger CLRCLR Triggers
I trigger CLR includono i trigger AFTER e INSTEAD OF.A CLR Trigger can be either an AFTER or INSTEAD OF trigger. Un trigger CLR può essere anche un trigger DDL.A CLR trigger can also be a DDL trigger. Anziché eseguire una stored procedure Transact-SQLTransact-SQL , un trigger CLR consente di eseguire uno o più metodi scritti in codice gestito che sono membri di un assembly creato in .NET Framework e caricato in SQL ServerSQL Server.Instead of executing a Transact-SQLTransact-SQL stored procedure, a CLR trigger executes one or more methods written in managed code that are members of an assembly created in the .NET Framework and uploaded in SQL ServerSQL Server.

AttivitàTask ArgomentoTopic
Viene illustrato come creare un trigger DML.Describes how to create a DML trigger. Creare trigger DML.Create DML Triggers
Viene illustrato come creare un trigger CLR.Describes how to create a CLR trigger. Creazione di trigger CLRCreate CLR Triggers
Viene descritto come creare un trigger DML per la gestione delle modifiche sia della singola riga che di più righe.Describes how to create a DML trigger to handle both single-row and multi-row data modifications. Creazione di trigger DML per gestire più righe di datiCreate DML Triggers to Handle Multiple Rows of Data
Viene descritto come annidare trigger.Describes how to nest triggers. Creazione di trigger annidatiCreate Nested Triggers
Viene descritto come specificare l'ordine in cui vengono generati trigger AFTER.Describes how to specify the order in which AFTER triggers are fired. Specifica dei primi e degli ultimi triggerSpecify First and Last Triggers
Viene descritto come utilizzare le tabelle speciali inserted e deleted nel codice del trigger.Describes how to use the special inserted and delete tables in trigger code. Utilizzo delle tabelle inserite ed eliminateUse the inserted and deleted Tables
Viene descritto come modificare o rinominare un trigger DML.Describes how to modify or rename a DML trigger. Modifica o ridenominazione di trigger DMLModify or Rename DML Triggers
Viene descritto come visualizzare informazioni sui trigger DML.Describes how to view information about DML triggers. Ottieni informazioni sui trigger DMLGet Information About DML Triggers
Vengono descritte le modalità di creazione, modifica e disabilitazione dei trigger DML.Describes how to delete or disable DML triggers. Eliminare o disabilitare trigger DMLDelete or Disable DML Triggers
Viene descritto come gestire la sicurezza dei trigger.Describes how to manage trigger security. Gestione della sicurezza dei triggerManage Trigger Security

Vedere ancheSee Also

CREATE TRIGGER (Transact-SQL) CREATE TRIGGER (Transact-SQL)
ALTER TRIGGER (Transact-SQL) ALTER TRIGGER (Transact-SQL)
DROP TRIGGER (Transact-SQL) DROP TRIGGER (Transact-SQL)
DISABLE TRIGGER (Transact-SQL) DISABLE TRIGGER (Transact-SQL)
Funzioni del trigger (Transact-SQL) Trigger Functions (Transact-SQL)