Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Erstellen Sie einen DML-Trigger in SQL Server

In SQL Server können Sie den CREATE TRIGGER verwenden -Anweisung zum Erstellen eines Triggers.

Ein Trigger ist eine spezielle Art von gespeicherter Prozedur, die automatisch ausgeführt wird, wenn ein Ereignis auf dem Datenbankserver auftritt.

Sie können einen DML-Trigger, einen DDL-Trigger oder einen Anmelde-Trigger erstellen.

Dieser Artikel enthält ein Beispiel für die Erstellung eines DML-Triggers.

Was ist ein DML-Trigger?

Ein DML-Trigger ist ein Trigger, der ausgeführt wird, wenn ein Benutzer versucht, Daten über ein DML-Ereignis (Data Manipulation Language) zu ändern.

DML-Ereignisse umfassen INSERT , UPDATE , oder DELETE Aussagen. DML-Trigger können verwendet werden, um Geschäftsregeln und Datenintegrität durchzusetzen, andere Tabellen abzufragen und komplexe T-SQL-Anweisungen einzufügen.

Der Trigger und die Anweisung, die ihn auslöst, werden als einzelne Transaktion behandelt, die innerhalb des Triggers rückgängig gemacht werden kann.

Beispiel

Hier ist ein Beispiel, um zu demonstrieren, wie DML-Trigger funktionieren.

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 diesem Beispiel erstelle ich eine Tabelle und ich erstelle auch einen Trigger, der immer dann ausgelöst wird, wenn eine Zeile in dieser Tabelle eingefügt oder aktualisiert wird.

In diesem Fall fügt der Trigger 1 zu c3 hinzu Spalte, wenn Daten eingefügt oder aktualisiert werden.

Ich habe den Trigger trg_t1 genannt . Ich folgte diesem Teil mit ON t1 , was bedeutet, dass der Trigger auf der Tabelle mit dem Namen t1 ausgeführt wird .

Sie können alternativ eine Ansicht angeben, auf der der Trigger ausgeführt werden soll, obwohl Sie eine Ansicht nur durch ein INSTEAD OF referenzieren können Auslöser (ersetzen Sie in diesem Fall AFTER mit INSTEAD OF ). Außerdem können Sie keine DML-Trigger für lokale oder globale temporäre Tabellen definieren.

AFTER gibt an, dass der DML-Trigger nur ausgelöst wird, wenn alle in der auslösenden SQL-Anweisung angegebenen Operationen erfolgreich gestartet wurden. Alternativ können Sie FOR angeben hier.

Eine weitere Alternative ist die Verwendung von INSTEAD OF , wodurch der Trigger stattdessen ausgeführt wird der auslösenden SQL-Anweisung. Dies überschreibt daher die Aktionen der auslösenden Anweisungen.

Was ist der inserted Tabelle?

In meinem Trigger kann ich herausfinden, welche Zeile aktualisiert wurde, indem ich den inserted abfrage Tabelle.

SQL Server erstellt und verwaltet eine Tabelle namens inserted , eine temporäre, speicherresidente Tabelle, die Kopien der betroffenen Zeilen während INSERT speichert und UPDATE Aussagen. Während einer Einfüge- oder Aktualisierungstransaktion werden sowohl dem inserted neue Zeilen hinzugefügt Tabelle und die Triggertabelle. Die Zeilen in der eingefügten Tabelle sind Kopien der neuen Zeilen in der Trigger-Tabelle.

SQL Server erstellt und verwaltet auch eine ähnliche Tabelle mit dem Namen "delete", in der Kopien der betroffenen Zeilen während DELETE gespeichert werden und UPDATE Aussagen. Während der Ausführung eines DELETE oder UPDATE -Anweisung werden Zeilen aus der Triggertabelle gelöscht und in die gelöschte Tabelle übertragen.

Trigger ausführen

Nachdem die Tabelle und ihr Auslöser erstellt wurden, führen wir einige SQL-Anweisungen aus, die sie auslösen.

INSERT INTO t1 (c1) 
VALUES (1);

SELECT * FROM t1;

Ergebnis:

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

Wir können also sehen, dass der Auslöser wie erwartet funktioniert hat. Als ich eine Zeile eingefügt habe, habe ich nur einen Wert für c1 angegeben Spalte, aber der Trigger hat dafür gesorgt, dass der c3 Spalte wurde ebenfalls aktualisiert.

Beachten Sie, dass der Standardwert für alle Spalten 0 ist (wie angegeben, als ich die Tabelle erstellt habe), und der Trigger fügte 1 hinzu.

Lassen Sie uns ein UPDATE durchführen Vorgang auf derselben Spalte.

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

SELECT * FROM t1;

Ergebnis:

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

Wieder einmal das c3 Spalte wurde ebenfalls durch den Trigger aktualisiert.

Jetzt aktualisieren wir c2 Spalte.

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

SELECT * FROM t1;

Ergebnis:

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

Also noch einmal das c3 Spalte wird durch den Trigger aktualisiert.

Dieser spezielle Trigger wird immer dann ausgelöst, wenn eine andere Spalte in derselben Zeile aktualisiert wird.

Sie können auch IF UPDATE(column_name) verwenden um nach einer Aktualisierung einer einzelnen Spalte zu suchen, oder COLUMNS_UPDATED() um in mehreren Spalten nach Aktualisierungen zu suchen.