I SQL Server kan du använda CREATE TRIGGER
uttalande för att skapa en utlösare.
En trigger är en speciell typ av lagrad procedur som körs automatiskt när en händelse inträffar i databasservern.
Du kan skapa en DML-utlösare, en DDL-utlösare eller en inloggningsutlösare.
Den här artikeln ger ett exempel på hur du skapar en DML-utlösare.
Vad är en DML-utlösare?
En DML-utlösare är en utlösare som körs när en användare försöker modifiera data genom en DML-händelse (data manipulation language).
DML-händelser inkluderar INSERT
, UPPDATERA
, eller DELETE
uttalanden. DML-utlösare kan användas för att upprätthålla affärsregler och dataintegritet, fråga efter andra tabeller och inkludera komplexa T-SQL-satser.
Utlösaren och uttalandet som aktiverar den behandlas som en enda transaktion, som kan återställas inifrån utlösaren.
Exempel
Här är ett exempel för att visa hur DML-utlösare fungerar.
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);
I det här exemplet skapar jag en tabell och jag skapar också en utlösare som kommer att aktiveras när en rad infogas eller uppdateras i den tabellen.
I det här fallet lägger utlösaren 1 till c3
kolumn när data infogas eller uppdateras.
Jag kallade utlösaren trg_t1
. Jag följde den delen med ON t1
, vilket betyder att utlösaren kommer att köras på tabellen som heter t1
.
Du kan alternativt ange en vy som utlösaren ska köras på, även om du bara kan referera till en vy med en I STÄLLET FÖR
utlösare (i det här fallet, ersätt AFTER
med I STÄLLET FÖR
). Du kan inte heller definiera DML-utlösare på lokala eller globala tillfälliga tabeller.
EFTER
anger att DML-utlösaren aktiveras endast när alla operationer som anges i den utlösande SQL-satsen har startat framgångsrikt. Du kan alternativt ange FOR
här.
Ett annat alternativ är att använda I STÄLLET FÖR
, som kör triggern istället av den utlösande SQL-satsen. Detta åsidosätter därför åtgärderna för de utlösande uttalandena.
Vad är insatt Tabell?
I min utlösare kan jag ta reda på vilken rad som uppdaterades genom att fråga den inserted
bord.
SQL Server skapar och hanterar en tabell som heter inserted
, som är en temporär, minnesresident tabell som lagrar kopior av de berörda raderna under INSERT
och UPPDATERA
uttalanden. Under en infogning eller uppdateringstransaktion läggs nya rader till i båda de infogade
tabellen och triggerbordet. Raderna i den infogade tabellen är kopior av de nya raderna i triggertabellen.
SQL Server skapar och underhåller också en liknande tabell som kallas deleted, som lagrar kopior av de berörda raderna under DELETE
och UPPDATERA
uttalanden. Under körningen av en DELETE
eller UPPDATERA
sats, rader raderas från triggertabellen och överförs till den borttagna tabellen.
Kör utlösaren
Nu när tabellen och dess utlösare har skapats, låt oss köra några SQL-satser som utlöser den.
INSERT INTO t1 (c1)
VALUES (1);
SELECT * FROM t1;
Resultat:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 1 | 0 | 1 | +------+------+------+------+
Så vi kan se att triggern fungerade som förväntat. När jag infogade en rad angav jag bara ett värde för c1
kolumnen, men utlösaren såg till att c3
kolumnen uppdaterades också.
Observera att standardvärdet för alla kolumner är 0
(som specificerats när jag skapade tabellen), och triggern lade till 1 till det.
Låt oss utföra en UPPDATERING
operation på samma kolumn.
UPDATE t1
SET c1 = c1 + 1
WHERE id = 1;
SELECT * FROM t1;
Resultat:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 2 | 0 | 2 | +------+------+------+------+
Återigen, c3
kolumnen uppdaterades också av utlösaren.
Låt oss nu uppdatera c2
kolumn.
UPDATE t1
SET c2 = c2 + 1
WHERE id = 1;
SELECT * FROM t1;
Resultat:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 2 | 1 | 3 | +------+------+------+------+
Så än en gång, c3
kolumnen uppdateras av utlösaren.
Den här utlösaren aktiveras när någon annan kolumn i samma rad uppdateras.
Du kan också använda OM UPPDATERING(kolumnnamn)
för att söka efter en uppdatering av en enskild kolumn, eller COLUMNS_UPDATED()
för att söka efter uppdateringar över flera kolumner.