Condividi tramite


Trigger DML

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di Azure

Il trigger DML è 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 INSERT, UPDATE o DELETE. I trigger DML possono essere utilizzati per applicare regole di business e l'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, di cui è possibile eseguire il rollback dal trigger stesso. Se viene rilevato un errore grave, ad esempio un'insufficienza di spazio su disco, viene eseguito automaticamente il rollback dell'intera transazione.

Vantaggi

I trigger DML sono simili ai vincoli in quanto sono in grado di applicare l'integrità di entità o di 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 CHECK vincoli e l'integrità referenziale deve essere applicata tramite FOREIGN KEY vincoli. I trigger DML sono più utili quando le funzionalità supportate dai vincoli non possono soddisfare le esigenze funzionali dell'applicazione.

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.

  • 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. FOREIGN KEY I vincoli possono convalidare un valore di colonna solo con una corrispondenza esatta con un valore in un'altra colonna, a meno che la REFERENCES clausola non definisca un'azione referenziale a catena.

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

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

  • 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.

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

  • I vincoli sono in grado di segnalare errori soltanto tramite messaggi di errore standard di sistema. Se nell'applicazione è necessario o consigliabile utilizzare messaggi personalizzati e gestire gli errori in modo più complesso, è necessario utilizzare 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 relativa chiave primaria. Tuttavia, FOREIGN KEY i vincoli vengono in genere usati a questo scopo.

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

Tipi di trigger DML

Trigger AFTER

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

Trigger INSTEAD OF

INSTEAD OF i trigger sostituiscono le azioni standard della dichiarazione di attivazione. Pertanto, possono essere usate per eseguire il controllo degli errori o dei valori su una o più colonne ed eseguire altre azioni prima di inserire, aggiornare o eliminare la riga o le righe. 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. Il vantaggio principale dei INSTEAD OF trigger è 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 INSTEAD OF trigger per supportare inserimenti, aggiornamenti ed eliminazioni che fanno riferimento ai dati in più tabelle. Un altro vantaggio dei INSTEAD OF trigger è che consentono di codificare la logica che può rifiutare parti di un batch, consentendo ad altre parti di un batch di avere esito positivo.

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

Funzione AFTER Attivatore INSTEAD OF Attivatore
Applicabilità Tabelle Tabelle e viste
Quantità per tabella o vista Multiplo per azione di attivazione (UPDATE, DELETEe INSERT) Una per azione di attivazione (UPDATE, DELETEe INSERT)
Riferimenti di propagazione Nessuna restrizione INSTEAD OF UPDATE e DELETE i trigger non sono consentiti nelle tabelle che sono destinazioni di vincoli di integrità referenziale a catena.
Esecuzione Dopo:

Elaborazione dei vincoli

Operazioni referenziali dichiarative

Creazione delle tabelle inserted e deleted

Operazione di trigger
Prima: elaborazione dei vincoli

Invece di: operazione di trigger

Dopo la creazione delle tabelle inserted e deleted
Ordine di esecuzione È possibile specificare il primo e l'ultima esecuzione Non applicabile
riferimenti alle colonne varchar(max), nvarchar(max)e varbinary(max) in inserted e deleted tabelle Consentito Consentito
riferimenti a colonne text, ntext e image in inserted e deleted tabelle Non consentito Consentito

Attivatore CLR

Un trigger CLR (Common Language Runtime) può essere un AFTER trigger o INSTEAD OF . Un trigger CLR può anche essere un trigger DDL (Data Definition Language). Anziché eseguire una stored procedure Transact-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 Server.

Attività Articolo
Viene illustrato come creare un trigger DML. Creare trigger DML
Viene illustrato come creare un trigger CLR. Creare trigger CLR
Viene descritto come creare un trigger DML per la gestione delle modifiche sia della singola riga che di più righe. Creare trigger DML per gestire più righe di dati
Viene descritto come annidare trigger. Creazione di trigger annidati
Si descrive come specificare l'ordine in cui i trigger AFTER vengono attivati. Specificare i primi e gli ultimi trigger
Viene descritto come utilizzare le tabelle speciali inserted e deleted nel codice del trigger. Usare le tabelle delle righe inserite e delle righe eliminate
Viene descritto 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
Vengono descritte le modalità di creazione, modifica e disabilitazione dei trigger DML. Eliminare e disabilitare trigger DML
Viene descritto come gestire la sicurezza dei trigger. Gestire la sicurezza dei trigger