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

So führen Sie einen Trigger nur aus, wenn eine bestimmte Spalte aktualisiert wird (SQL Server)

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.