I SQL Server kan du bruge CREATE TRIGGER
sætning for at oprette en trigger.
En trigger er en speciel type lagret procedure, der automatisk kører, når en hændelse opstår på databaseserveren.
Du kan oprette en DML-trigger, en DDL-trigger eller en logon-trigger.
Denne artikel giver et eksempel på oprettelse af en DML-trigger.
Hvad er en DML Trigger?
En DML-trigger er en trigger, der kører, når en bruger forsøger at ændre data gennem en datamanipulationssprog-hændelse (DML).
DML-hændelser inkluderer INSERT
, UPDATE
eller DELETE
udsagn. DML-triggere kan bruges til at håndhæve forretningsregler og dataintegritet, forespørge i andre tabeller og inkludere komplekse T-SQL-sætninger.
Udløseren og erklæringen, der udløser den, behandles som en enkelt transaktion, der kan rulles tilbage inde fra udløseren.
Eksempel
Her er et eksempel for at demonstrere, hvordan DML-triggere virker.
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 dette eksempel opretter jeg en tabel, og jeg opretter også en trigger, der udløses, hver gang en række indsættes eller opdateres i den tabel.
I dette tilfælde tilføjer triggeren 1 til c3
kolonne, når data indsættes eller opdateres.
Jeg kaldte triggeren trg_t1
. Jeg fulgte den del med ON t1
, hvilket betyder, at triggeren køres på tabellen kaldet t1
.
Du kan alternativt angive en visning, som triggeren skal køre på, selvom du kun kan henvise til en visning med en INSTEAD OF
trigger (i dette tilfælde skal du erstatte AFTER
med INSTEAD OF
). Du kan heller ikke definere DML-udløsere på lokale eller globale midlertidige tabeller.
AFTER
angiver, at DML-udløseren kun udløses, når alle operationer, der er angivet i den udløsende SQL-sætning, er blevet startet. Du kan alternativt angive FOR
her.
Et andet alternativ er at bruge INSTEAD OF
, som vil køre triggeren i stedet af den udløsende SQL-sætning. Dette tilsidesætter derfor handlingerne i de udløsende udsagn.
Hvad er den inserted
Tabel?
I min trigger er jeg i stand til at finde ud af, hvilken række der blev opdateret ved at forespørge på inserted
tabel.
SQL Server opretter og administrerer en tabel kaldet inserted
, som er en midlertidig, hukommelsesresident tabel, der gemmer kopier af de berørte rækker under INSERT
og UPDATE
udsagn. Under en indsættelses- eller opdateringstransaktion tilføjes nye rækker til både de inserted
bordet og triggerbordet. Rækkerne i den indsatte tabel er kopier af de nye rækker i triggertabellen.
SQL Server opretter og vedligeholder også en lignende tabel kaldet slettet, som gemmer kopier af de berørte rækker under DELETE
og UPDATE
udsagn. Under udførelsen af en DELETE
eller UPDATE
sætning slettes rækker fra triggertabellen og overføres til den slettede tabel.
Kør triggeren
Nu hvor tabellen og dens trigger er blevet oprettet, lad os køre nogle SQL-sætninger, der vil udløse den.
INSERT INTO t1 (c1)
VALUES (1);
SELECT * FROM t1;
Resultat:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 1 | 0 | 1 | +------+------+------+------+
Så vi kan se, at triggeren virkede som forventet. Da jeg indsatte en række, specificerede jeg kun en værdi for c1
kolonne, men udløseren sikrede, at c3
kolonne blev også opdateret.
Bemærk, at standardværdien for alle kolonner er 0
(som angivet, da jeg oprettede tabellen), og triggeren tilføjede 1 til det.
Lad os udføre en UPDATE
operation på samme kolonne.
UPDATE t1
SET c1 = c1 + 1
WHERE id = 1;
SELECT * FROM t1;
Resultat:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 2 | 0 | 2 | +------+------+------+------+
Endnu en gang, c3
kolonnen blev også opdateret af triggeren.
Lad os nu opdatere c2
kolonne.
UPDATE t1
SET c2 = c2 + 1
WHERE id = 1;
SELECT * FROM t1;
Resultat:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 2 | 1 | 3 | +------+------+------+------+
Så endnu en gang, c3
kolonnen opdateres af triggeren.
Denne særlige udløser aktiveres, hver gang en anden kolonne i samme række opdateres.
Du kan også bruge IF UPDATE(column_name)
for at søge efter en opdatering til en enkelt kolonne, eller COLUMNS_UPDATED()
for at søge efter opdateringer på tværs af flere kolonner.