Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Creare un trigger DML in SQL Server

In SQL Server puoi usare CREATE TRIGGER istruzione per creare un trigger.

Un trigger è un tipo speciale di stored procedure che viene eseguito automaticamente quando si verifica un evento nel server di database.

Puoi creare un trigger DML, un trigger DDL o un trigger di accesso.

Questo articolo fornisce un esempio di creazione di un trigger DML.

Cos'è un trigger DML?

Un trigger DML è un trigger che viene eseguito quando un utente tenta di modificare i dati tramite un evento DML (Data Manipulation Language).

Gli eventi DML includono INSERT , UPDATE o DELETE dichiarazioni. I trigger DML possono essere utilizzati per applicare regole aziendali e integrità dei dati, eseguire query su altre tabelle e includere istruzioni T-SQL complesse.

Il trigger e l'istruzione che lo attiva vengono trattati come una singola transazione, di cui è possibile eseguire il rollback dall'interno del trigger.

Esempio

Ecco un esempio per dimostrare come funzionano i trigger DML.

CREATE TABLE t1 (
    id int IDENTITY(1,1) NOT NULL,
    c1 int DEFAULT 0,
    c2 int DEFAULT 0,
    c3 int DEFAULT 0
);

CREATE TRIGGER trg_t1
ON t1
AFTER INSERT, UPDATE
AS
UPDATE t1
SET c3 = c3 + 1
WHERE id IN (SELECT DISTINCT id FROM inserted);

In questo esempio creo una tabella e creo anche un trigger che verrà attivato ogni volta che una riga viene inserita o aggiornata in quella tabella.

In questo caso, il trigger aggiunge 1 al c3 colonna ogni volta che i dati vengono inseriti o aggiornati.

Ho chiamato il trigger trg_t1 . Ho seguito quella parte con ON t1 , il che significa che il trigger verrà eseguito sulla tabella denominata t1 .

In alternativa puoi specificare una vista su cui eseguire il trigger, anche se puoi fare riferimento a una vista solo con un INSTEAD OF trigger (in questo caso, sostituisci AFTER con INSTEAD OF ). Inoltre, non puoi definire attivatori DML su tabelle temporanee locali o globali.

AFTER specifica che il trigger DML si attiva solo quando tutte le operazioni specificate nell'istruzione SQL di trigger sono state avviate correttamente. In alternativa puoi specificare FOR qui.

Un'altra alternativa è usare INSTEAD OF , che eseguirà il trigger invece dell'istruzione SQL di attivazione. Ciò pertanto prevale sulle azioni delle istruzioni di attivazione.

Qual ​​è il inserted Tavolo?

Nel mio trigger, sono in grado di scoprire quale riga è stata aggiornata eseguendo una query su inserted tabella.

SQL Server crea e gestisce una tabella denominata inserted , che è una tabella temporanea residente in memoria che archivia le copie delle righe interessate durante INSERT e UPDATE dichiarazioni. Durante una transazione di inserimento o aggiornamento, vengono aggiunte nuove righe a entrambi gli inserted tabella e la tabella trigger. Le righe nella tabella inserita sono copie delle nuove righe nella tabella trigger.

SQL Server crea e gestisce anche una tabella simile denominata eliminata, che archivia le copie delle righe interessate durante DELETE e UPDATE dichiarazioni. Durante l'esecuzione di un DELETE o UPDATE istruzione, le righe vengono eliminate dalla tabella trigger e trasferite alla tabella eliminata.

Esegui il trigger

Ora che la tabella e il relativo trigger sono stati creati, eseguiamo alcune istruzioni SQL che lo attiveranno.

INSERT INTO t1 (c1) 
VALUES (1);

SELECT * FROM t1;

Risultato:

+------+------+------+------+
| id   | c1   | c2   | c3   |
|------+------+------+------|
| 1    | 1    | 0    | 1    |
+------+------+------+------+

Quindi possiamo vedere che il trigger ha funzionato come previsto. Quando ho inserito una riga, ho specificato solo un valore per c1 colonna, ma il trigger ha assicurato che il c3 anche la colonna è stata aggiornata.

Nota che il valore predefinito per tutte le colonne è 0 (come specificato quando ho creato la tabella) e il trigger ha aggiunto 1 a quello.

Eseguiamo un UPDATE operazione sulla stessa colonna.

UPDATE t1 
SET c1 = c1 + 1
WHERE id = 1;

SELECT * FROM t1;

Risultato:

+------+------+------+------+
| id   | c1   | c2   | c3   |
|------+------+------+------|
| 1    | 2    | 0    | 2    |
+------+------+------+------+

Ancora una volta, il c3 anche la colonna è stata aggiornata dal trigger.

Ora aggiorniamo il c2 colonna.

UPDATE t1 
SET c2 = c2 + 1
WHERE id = 1;

SELECT * FROM t1;

Risultato:

+------+------+------+------+
| id   | c1   | c2   | c3   |
|------+------+------+------|
| 1    | 2    | 1    | 3    |
+------+------+------+------+

Quindi, ancora una volta, il c3 la colonna viene aggiornata dal trigger.

Questo particolare attivatore viene attivato ogni volta che viene aggiornata un'altra colonna nella stessa riga.

Puoi anche usare IF UPDATE(column_name) per verificare la presenza di un aggiornamento in una singola colonna o COLUMNS_UPDATED() per verificare la presenza di aggiornamenti su più colonne.