Condividi tramite


Trigger di DML

I trigger DML sono un tipo speciale di stored procedure che diventa automaticamente effettivo quando si verifica un evento DML (Data Manipulation Language) che influisce sulla tabella o sulla vista definita nel trigger. Gli eventi DML includono istruzioni INSERT, UPDATE o DELETE. I trigger DML possono essere usati per applicare regole business e integrità dei dati, eseguire query su altre tabelle e includere istruzioni Transact-SQL complesse. Il trigger e l'istruzione che lo attiva vengono considerati come una singola transazione, il cui rollback può essere eseguito da dentro il trigger. Se viene rilevato un errore grave (ad esempio, spazio su disco insufficiente), viene eseguito automaticamente il rollback dell'intera transazione.

Vantaggi del trigger DML

I trigger DML sono simili ai vincoli in quanto possono applicare l'integrità dell'entità o l'integrità del dominio. In generale, l'integrità delle entità deve essere sempre applicata al livello più basso dagli indici che fanno parte dei vincoli PRIMARY KEY e UNIQUE o vengono creati indipendentemente dai vincoli. L'integrità del dominio deve essere applicata tramite vincoli CHECK e l'integrità referenziale deve essere applicata tramite vincoli FOREIGN KEY. I trigger DML sono più utili quando le funzionalità supportate dai vincoli non possono soddisfare le esigenze funzionali dell'applicazione.

L'elenco seguente confronta i trigger DML con i vincoli e identifica quando i trigger DML presentano vantaggi rispetto a .

  • I trigger DML possono propagare le modifiche tramite tabelle correlate nel database; Tuttavia, queste modifiche possono essere eseguite in modo più efficiente usando vincoli di integrità referenziale a catena. I vincoli FOREIGN KEY possono convalidare un valore di colonna solo con una corrispondenza esatta con un valore in un'altra colonna, a meno che la clausola REFERENCES non definisca un'azione referenziale a catena.

  • Possono proteggersi da operazioni INSERT, UPDATE e DELETE dannose o errate e applicare altre restrizioni più complesse rispetto a quelle definite con vincoli CHECK.

    A differenza dei vincoli CHECK, i trigger DML possono fare riferimento a colonne in altre tabelle. Ad esempio, un trigger può usare un'istruzione SELECT di un'altra tabella per confrontare i dati inseriti o aggiornati e per eseguire azioni aggiuntive, ad esempio modificare i dati o visualizzare un messaggio di errore definito dall'utente.

  • Possono valutare lo stato di una tabella prima e dopo una modifica dei dati e intraprendere azioni in base a tale differenza.

  • Più trigger DML dello stesso tipo (INSERT, UPDATE o DELETE) in una tabella consentono l'esecuzione di più azioni diverse in risposta alla stessa istruzione di modifica.

  • I vincoli possono comunicare sugli errori solo tramite messaggi di errore di sistema standardizzati. Se l'applicazione richiede o può trarre vantaggio dai messaggi personalizzati e dalla gestione degli errori più complessa, è necessario usare un trigger.

  • I trigger DML possono impedire o eseguire il rollback delle modifiche che violano l'integrità referenziale, annullando così il tentativo di modifica dei dati. Un trigger di questo tipo potrebbe essere attivo quando si modifica una chiave esterna e il nuovo valore non corrisponde alla chiave primaria. Tuttavia, i vincoli FOREIGN KEY vengono in genere usati a questo scopo.

  • Se esistono vincoli nella tabella dei trigger, vengono controllati dopo l'esecuzione del trigger INSTEAD OF, ma prima dell'esecuzione del trigger AFTER. Se i vincoli vengono violati, viene eseguito il rollback delle azioni trigger INSTEAD OF e il trigger AFTER non viene eseguito.

Tipi di trigger DML

AFTER trigger
I trigger AFTER vengono eseguiti dopo l'esecuzione dell'azione dell'istruzione INSERT, UPDATE, MERGE o DELETE. I trigger AFTER non vengono mai eseguiti se si verifica una violazione del vincolo; pertanto, questi trigger non possono essere usati per qualsiasi elaborazione che potrebbe impedire violazioni dei vincoli. Per ogni azione INSERT, UPDATE o DELETE specificata in un'istruzione MERGE, il corrispondente trigger viene attivato per ciascuna operazione DML.

Trigger INSTEAD OF
I trigger INSTEAD OF sostituiscono le azioni standard dell'istruzione di attivazione. Pertanto, possono essere usati per eseguire il controllo degli errori o dei valori su una o più colonne ed eseguire azioni aggiuntive prima di inserire, aggiornare o eliminare la riga o le righe. Ad esempio, quando il valore da aggiornare in una colonna salaria oraria in una tabella retribuzione supera un valore specificato, è possibile definire un trigger per generare un messaggio di errore e eseguire il rollback della transazione oppure inserire un nuovo record in un audit trail prima di inserire il record nella tabella delle retribuzioni. Il vantaggio principale dei trigger INSTEAD OF è che abilitano le visualizzazioni che non sarebbero aggiornabili per supportare gli aggiornamenti. Ad esempio, una vista basata su più tabelle di base deve usare un trigger INSTEAD OF per supportare inserimenti, aggiornamenti ed eliminazioni che fanno riferimento ai dati in più tabelle. Un altro vantaggio dei trigger INSTEAD OF è che consentono di codificare la logica in grado di rifiutare parti di un batch consentendo ad altre parti di un batch di avere esito positivo.

Questa tabella confronta le funzionalità dei trigger AFTER e INSTEAD OF.

Funzione trigger dopo Trigger INSTEAD OF
Applicabilità Tabelle Tabelle e viste
Quantità per tabella o vista Più azioni di attivazione (UPDATE, DELETE e INSERT) Una per azione di attivazione (UPDATE, DELETE e INSERT)
Riferimenti a catena Nessuna restrizione applicabile I trigger INSTEAD OF UPDATE e INSTEAD OF DELETE non sono consentiti nelle tabelle soggette a vincoli di integrità referenziale in cascata.
Esecuzione Dopo:

Elaborazione dei vincoli
Azioni referenziali dichiarative
creazione di tabelle aggiunte e rimosse
Azione di attivazione
Prima: elaborazione dei vincoli

Al posto di: Azione di attivazione

Dopo: creazione di tabelle inserite ed eliminate
Ordine di esecuzione È possibile specificare il primo e l'ultima esecuzione Non applicabile
Riferimenti a colonne varchar(max), nvarchar(max) e varbinary(max) nelle tabelle inserite ed eliminate Permesso Permesso
Riferimenti a colonne text, ntext e image nelle tabelle inserite ed eliminate Non consentito Permesso

Trigger CLR
Un trigger CLR può essere un trigger AFTER o INSTEAD OF. Un trigger CLR può anche essere un trigger DDL. Anziché eseguire una stored procedure Transact-SQL, un trigger CLR esegue uno o più metodi scritti in codice gestito che sono membri di un assembly creato in .NET Framework e caricati in SQL Server.

Attività Argomento
Viene descritto come creare un trigger DML. Creare trigger DML
Viene descritto come creare un trigger CLR. Creare trigger CLR
Viene descritto come creare un trigger DML per gestire sia le modifiche ai dati a riga singola che a più righe. Creare trigger DML per gestire più righe di dati
Descrive come annidare i trigger. Creare trigger annidati
Descrive come specificare l'ordine in cui vengono attivati i trigger AFTER. Specificare i trigger first e last
Viene descritto come usare le tabelle speciali inserite ed eliminate nel codice trigger. Usare le tabelle inserite ed eliminate
Descrive come modificare o rinominare un trigger DML. Modificare o rinominare trigger DML
Viene descritto come visualizzare informazioni sui trigger DML. Recuperare informazioni sui trigger DML
Viene descritto come eliminare o disabilitare i trigger DML. Eliminare o disabilitare i Trigger DML
Viene descritto come gestire la sicurezza dei trigger. Gestire la sicurezza dei trigger

Vedere anche

CREATE TRIGGER (Transact-SQL)
ALTER TRIGGER (Transact-SQL)
DROP TRIGGER (Transact-SQL)
DISABLE TRIGGER (Transact-SQL)
Funzioni di attivazione (Transact-SQL)