SQL Server má UPDATE()
funkce, kterou můžete použít v rámci vašich spouštěčů DML ke kontrole, zda byl či nebyl aktualizován konkrétní sloupec.
I když tato funkce přijímá pouze jeden sloupec, nic vám nebrání zahrnout více UPDATE()
klauzule s AND
nebo OR
pro testování aktualizací více sloupců.
Příklad
Zde je tabulka:
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
);
A tady je spouštěč:
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;
V tomto případě c4
sloupec se zvýší pouze v případě, že c1
nebo c2
sloupce byly aktualizovány. K tomu dojde, i když je aktualizován pouze jeden z těchto dvou sloupců (kvůli tomu, že používám OR
na rozdíl od AND
).
Nyní otestujeme spouštěč vložením dat do c1
.
INSERT INTO t1 (c1)
VALUES (1);
SELECT * FROM t1;
Výsledek:
+------+------+------+------+------+ | id | c1 | c2 | c3 | c4 | |------+------+------+------+------| | 1 | 1 | 0 | 0 | 1 | +------+------+------+------+------+
Podle očekávání c4
byl také aktualizován, když c1
byl aktualizován.
To platí také vždy, když c2
je aktualizován.
UPDATE t1
SET c2 = c2 + 1
WHERE id = 1;
SELECT * FROM t1;
Výsledek:
+------+------+------+------+------+ | id | c1 | c2 | c3 | c4 | |------+------+------+------+------| | 1 | 1 | 1 | 0 | 2 | +------+------+------+------+------+
A samozřejmě by to také platilo, když jsou oba aktualizovány.
Nicméně nebude platí, pokud aktualizujeme c3
(ale ne c1
nebo c2
).
UPDATE t1
SET c3 = c3 + 1
WHERE id = 1;
SELECT * FROM t1;
Výsledek:
+------+------+------+------+------+ | id | c1 | c2 | c3 | c4 | |------+------+------+------+------| | 1 | 1 | 1 | 1 | 2 | +------+------+------+------+------+
Vyžadování aktualizace obou sloupců
Můžeme změnit OR
na AND
specifikovat, že c4
sloupec se aktualizuje pouze v případě, že obě c1
a c2
jsou aktualizovány.
Upravme náš spouštěč, abychom toto specifikovali:
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;
Nyní aktualizujte c1
pouze.
UPDATE t1
SET c1 = c1 + 1
WHERE id = 1;
SELECT * FROM t1;
Výsledek:
+------+------+------+------+------+ | id | c1 | c2 | c3 | c4 | |------+------+------+------+------| | 1 | 2 | 1 | 1 | 2 | +------+------+------+------+------+
Takže c1
byl aktualizován podle specifikace, ale c4
nebyl.
Totéž by se stalo, kdybychom aktualizovali c2
ale ne c1
.
Nyní však aktualizujme obě c1
a c2
.
UPDATE t1
SET c1 = c1 + 1, c2 = c2 + 1
WHERE id = 1;
SELECT * FROM t1;
Výsledek:
+------+------+------+------+------+ | id | c1 | c2 | c3 | c4 | |------+------+------+------+------| | 1 | 3 | 2 | 1 | 3 | +------+------+------+------+------+
Jak se očekávalo, tentokrát c4
byl také aktualizován.
Neúspěšné aktualizace
Je důležité si uvědomit, že UPDATE()
funkce pouze indikuje, zda INSERT
nebo UPDATE
pokus byl vytvořen v určeném sloupci tabulky nebo pohledu. Stále se vrátí true, pokud byl pokus neúspěšný.
Funkce COLUMNS_UPDATED
Dalším způsobem, jak zkontrolovat aktualizace ve více sloupcích, je použít COLUMNS_UPDATED
funkce.
Tato funkce vrací varbinary bitový vzor označující vložené nebo aktualizované sloupce tabulky nebo pohledu.
Další informace naleznete v dokumentaci společnosti Microsoft pro COLUMNS_UPDATED
.