SQL Server heeft de UPDATE()
functie die u kunt gebruiken binnen uw DML-triggers om te controleren of een specifieke kolom is bijgewerkt.
Hoewel deze functie slechts één kolom accepteert, houdt niets u tegen om meerdere UPDATE()
op te nemen. clausules met AND
of OR
om te testen op updates van meerdere kolommen.
Voorbeeld
Hier is de tabel:
CREATE TABLE t1 (
id int IDENTITY(1,1) NOT NULL,
c1 int DEFAULT 0,
c2 int DEFAULT 0,
c3 int DEFAULT 0,
c4 int DEFAULT 0
);
En hier is de trigger:
CREATE TRIGGER trg_t1
ON t1
AFTER INSERT, UPDATE
AS
IF ( UPDATE(c1) OR UPDATE(c2) )
BEGIN
UPDATE t1
SET c4 = c4 + 1
WHERE id IN (SELECT DISTINCT id FROM inserted)
END;
In dit geval is de c4
kolom wordt alleen verhoogd als de c1
of c2
kolommen zijn bijgewerkt. Dit gebeurt zelfs als slechts één van die twee kolommen wordt bijgewerkt (omdat ik OR
gebruik) in tegenstelling tot AND
).
Laten we nu de trigger testen door gegevens in te voegen in c1
.
INSERT INTO t1 (c1)
VALUES (1);
SELECT * FROM t1;
Resultaat:
+------+------+------+------+------+ | id | c1 | c2 | c3 | c4 | |------+------+------+------+------| | 1 | 1 | 0 | 0 | 1 | +------+------+------+------+------+
Zoals verwacht, c4
werd ook bijgewerkt toen c1
is bijgewerkt.
Dit geldt ook wanneer c2
is bijgewerkt.
UPDATE t1
SET c2 = c2 + 1
WHERE id = 1;
SELECT * FROM t1;
Resultaat:
+------+------+------+------+------+ | id | c1 | c2 | c3 | c4 | |------+------+------+------+------| | 1 | 1 | 1 | 0 | 2 | +------+------+------+------+------+
En natuurlijk zou het ook van toepassing zijn wanneer beide zijn bijgewerkt.
Het zal echter niet toepassen als we c3
updaten (maar niet c1
of c2
).
UPDATE t1
SET c3 = c3 + 1
WHERE id = 1;
SELECT * FROM t1;
Resultaat:
+------+------+------+------+------+ | id | c1 | c2 | c3 | c4 | |------+------+------+------+------| | 1 | 1 | 1 | 1 | 2 | +------+------+------+------+------+
Vereist dat beide kolommen worden bijgewerkt
We kunnen de OR
. wijzigen naar AND
om aan te geven dat de c4
kolom wordt alleen bijgewerkt als zowel c1
en c2
worden bijgewerkt.
Laten we onze trigger wijzigen om dit te specificeren:
ALTER TRIGGER trg_t1
ON t1
AFTER INSERT, UPDATE
AS
IF ( UPDATE(c1) AND UPDATE(c2) )
BEGIN
UPDATE t1
SET c4 = c4 + 1
WHERE id IN (SELECT DISTINCT id FROM inserted)
END;
Update nu c1
alleen.
UPDATE t1
SET c1 = c1 + 1
WHERE id = 1;
SELECT * FROM t1;
Resultaat:
+------+------+------+------+------+ | id | c1 | c2 | c3 | c4 | |------+------+------+------+------| | 1 | 2 | 1 | 1 | 2 | +------+------+------+------+------+
Dus c1
is bijgewerkt zoals gespecificeerd, maar c4
was niet.
Hetzelfde zou gebeuren als we c2
. zouden updaten maar niet c1
.
Maar laten we nu beide c1
. updaten en c2
.
UPDATE t1
SET c1 = c1 + 1, c2 = c2 + 1
WHERE id = 1;
SELECT * FROM t1;
Resultaat:
+------+------+------+------+------+ | id | c1 | c2 | c3 | c4 | |------+------+------+------+------| | 1 | 3 | 2 | 1 | 3 | +------+------+------+------+------+
Zoals verwacht, deze keer c4
is ook bijgewerkt.
Mislukte updates
Het is belangrijk op te merken dat de UPDATE()
functie geeft alleen aan of een INSERT
of UPDATE
poging is gemaakt op een opgegeven kolom van een tabel of weergave. Het zal nog steeds true retourneren als de poging niet succesvol was.
De COLUMNS_UPDATED-functie
Een andere manier om te controleren op updates in meerdere kolommen is door de COLUMNS_UPDATED
. te gebruiken functie.
Deze functie retourneert een varbinary bitpatroon dat de ingevoegde of bijgewerkte kolommen van een tabel of weergave aangeeft.
Zie voor meer informatie de Microsoft-documentatie voor COLUMNS_UPDATED
.