sql >> Databasteknik >  >> RDS >> Sqlserver

Skapa en DML-utlösare i SQL Server

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.


  1. Hur får man de avgränsande koordinaterna för ett amerikanskt postnummer?

  2. Finns det något som en zip()-funktion i PostgreSQL som kombinerar två arrayer?

  3. Använder MySQL med Oracle Heterogeneous Services

  4. Säkerhetskopiera PostgreSQL med pg_dump och pg_dumpall