Na serveru SQL Server můžete vytvořit spouštěče DML, které spouštějí kód pouze při aktualizaci určitého sloupce.
Spouštěč se stále spouští, ale můžete otestovat, zda byl konkrétní sloupec aktualizován či nikoli, a poté spustit kód pouze v případě, že byl tento sloupec aktualizován.
Můžete to provést pomocí UPDATE() funkce uvnitř vaší spouště. Tato funkce přijímá jako argument název sloupce. Vrací boolean.
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
); A tady je spouštěč:
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;
V tomto příkladu vytvořím tabulku s názvem t1 a spouštěč nazvaný trg_t1 .
Používám IF spolu s UPDATE() funkce pro testování, zda c1 sloupec byl aktualizován.
Když se spouštěč spustí, spustí následující kód pouze v případě, že je tato podmínka pravdivá.
Spustit spouštěč
Vložíme řádek, ale do c1 vložíme pouze hodnotu sloupec.
INSERT INTO t1 (c1)
VALUES (1);
SELECT * FROM t1; Výsledek:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 1 | 0 | 1 | +------+------+------+------+
Podle očekávání se spustilo pravidlo a sloupec c3 byl také aktualizován.
Stalo se to, protože jsem zahrnul INSERT argument v definici mého spouštěče (tj. zadal jsem AFTER INSERT, UPDATE což znamená, že spouštěč se spustí při každém vložení nebo aktualizaci dat). Kdybych uvedl pouze AFTER UPDATE , nespustil by se, když jsem vložil data – spustil by se pouze tehdy, když aktualizuji existující data.
Pamatujte, že tabulka byla definována pomocí DEFAULT 0 , takže sloupec c2 má výchozí hodnotu nula.
Nyní aktualizujme c1 sloupec.
UPDATE t1
SET c1 = c1 + 1
WHERE id = 1;
SELECT * FROM t1; Výsledek:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 2 | 0 | 2 | +------+------+------+------+
Opět c3 sloupec byl aktualizován spolu s c1 .
Nyní provedeme aktualizaci c2 sloupec (tento sloupec není součástí pravidla).
UPDATE t1
SET c2 = c2 + 1
WHERE id = 1;
SELECT * FROM t1; Výsledek:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 2 | 1 | 2 | +------+------+------+------+
Takže tentokrát c2 byl aktualizován, ale c3 nebyl. Je to proto, že c1 sloupec nebyl aktualizován a náš spouštěč aktualizuje pouze c3 když c1 je aktualizován.
Totéž by se stalo, kdybychom vložili řádek bez určení c1 v INSERT prohlášení.
Co když aktualizuji sloupec se stejnou hodnotou?
Pokud aktualizujete sloupec se stejnou hodnotou, UPDATE() funkce vrátí true.
Zde je příklad.
Z našich předchozích příkladů víme, že sloupec c1 obsahuje hodnotu 2 .
Pojďme explicitně aktualizovat tento sloupec se stejnou hodnotou:1
UPDATE t1
SET c1 = 2
WHERE id = 1;
SELECT * FROM t1; Výsledek:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 2 | 1 | 3 | +------+------+------+------+
Takže teď c3 se zvýšil, i když hodnota pro c1 je stále stejný.
Udělejme to znovu, ale tentokrát to nastavte na sebe (tj. změňte c1 = 1 na c1 = c1 ).
UPDATE t1
SET c1 = c1
WHERE id = 1;
SELECT * FROM t1; Výsledek:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 2 | 1 | 4 | +------+------+------+------+
Opět c3 se zvýšil.
Neúspěšné pokusy o aktualizaci
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. Pokud byl pokus neúspěšný, bude stále vracet hodnotu true.