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

Opret en DML Trigger i SQL Server

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.


  1. Sådan opretter du en totalrække i Access

  2. Oracle som løsning af muterende tabeller

  3. iPhone humørikoner indsættes i MySQL, men bliver tom værdi

  4. SSRS-rapportdefinitionen er nyere end Server