In SQL Server können Sie DML-Trigger erstellen, die Code nur ausführen, wenn eine bestimmte Spalte aktualisiert wird.
Der Trigger wird immer noch ausgelöst, aber Sie können testen, ob eine bestimmte Spalte aktualisiert wurde oder nicht, und dann Code nur ausführen, wenn diese Spalte aktualisiert wurde.
Sie können dies tun, indem Sie UPDATE()
verwenden Funktion in Ihrem Trigger. Diese Funktion akzeptiert den Spaltennamen als Argument. Es gibt einen booleschen Wert zurück.
Beispiel
Hier ist die Tabelle:
CREATE TABLE t1 (
id int IDENTITY(1,1) NOT NULL,
c1 int DEFAULT 0,
c2 int DEFAULT 0,
c3 int DEFAULT 0
);
Und hier ist der Auslöser:
CREATE TRIGGER trg_t1
ON t1
AFTER INSERT, UPDATE
AS
IF ( UPDATE (c1) )
BEGIN
UPDATE t1
SET c3 = c3 + 1
WHERE id IN (SELECT DISTINCT id FROM inserted)
END;
In diesem Beispiel erstelle ich eine Tabelle namens t1
und einen Trigger namens trg_t1
.
Ich verwende ein IF
-Anweisung zusammen mit dem UPDATE()
Funktion, um zu testen, ob der c1
Spalte wurde aktualisiert.
Wenn der Trigger ausgeführt wird, führt er den nachfolgenden Code nur aus, wenn diese Bedingung wahr ist.
Feuer den Auslöser
Lassen Sie uns eine Zeile einfügen, aber wir fügen nur einen Wert in c1
ein Spalte.
INSERT INTO t1 (c1)
VALUES (1);
SELECT * FROM t1;
Ergebnis:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 1 | 0 | 1 | +------+------+------+------+
Wie erwartet wurde der Trigger ausgelöst und die Spalte c3
wurde auch aktualisiert.
Dies geschah, weil ich den INSERT
eingefügt habe Argument in der Definition meines Triggers (d. h. ich habe AFTER INSERT, UPDATE
angegeben was bedeutet, dass der Trigger immer dann ausgelöst wird, wenn Daten eingefügt oder aktualisiert werden). Wenn ich nur AFTER UPDATE
angegeben hätte , wäre es nicht ausgelöst worden, als ich Daten eingefügt habe – es wurde nur ausgelöst, wenn ich vorhandene Daten aktualisiere.
Denken Sie daran, dass die Tabelle mit DEFAULT 0
definiert wurde , sodass die c2-Spalte standardmäßig auf Null gesetzt wurde.
Jetzt aktualisieren wir c1
Spalte.
UPDATE t1
SET c1 = c1 + 1
WHERE id = 1;
SELECT * FROM t1;
Ergebnis:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 2 | 0 | 2 | +------+------+------+------+
Wieder das c3
Spalte wurde zusammen mit c1
aktualisiert .
Lassen Sie uns nun ein Update für c2
durchführen Spalte (diese Spalte ist nicht im Trigger enthalten).
UPDATE t1
SET c2 = c2 + 1
WHERE id = 1;
SELECT * FROM t1;
Ergebnis:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 2 | 1 | 2 | +------+------+------+------+
Diesmal also c2
wurde aktualisiert, aber c3
war nicht. Das liegt daran, dass c1
Spalte wurde nicht aktualisiert und unser Trigger aktualisiert nur c3
wenn c1
wird aktualisiert.
Dasselbe wäre passiert, wenn wir eine Zeile eingefügt hätten, ohne c1 in INSERT
anzugeben Aussage.
Was ist, wenn ich die Spalte mit demselben Wert aktualisiere?
Wenn Sie eine Spalte mit demselben Wert aktualisieren, wird die UPDATE()
Die Funktion gibt wahr zurück.
Hier ist ein Beispiel.
Wir wissen aus unseren vorherigen Beispielen, dass die Spalte c1 einen Wert von 2
enthält .
Lassen Sie uns diese Spalte explizit mit demselben Wert aktualisieren:1
UPDATE t1
SET c1 = 2
WHERE id = 1;
SELECT * FROM t1;
Ergebnis:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 2 | 1 | 3 | +------+------+------+------+
Also jetzt c3
erhöht hat, obwohl der Wert für c1
ist immer noch gleich.
Machen wir es noch einmal, aber dieses Mal setzen wir es auf sich selbst (d.h. ändern Sie c1 = 1
zu c1 = c1
).
UPDATE t1
SET c1 = c1
WHERE id = 1;
SELECT * FROM t1;
Ergebnis:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 2 | 1 | 4 | +------+------+------+------+
Wieder c3
hat sich erhöht.
Nicht erfolgreiche Aktualisierungsversuche
Es ist wichtig zu beachten, dass das UPDATE()
Funktion gibt lediglich an, ob ein INSERT
oder UPDATE
Versuch wurde in einer angegebenen Spalte einer Tabelle oder Ansicht ausgeführt. Es wird immer noch true zurückgeben, wenn der Versuch nicht erfolgreich war.