sql >> Databáze >  >> RDS >> Sqlserver

Spustit spouštěč pouze při aktualizaci určitých sloupců (SQL Server)

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 .


  1. SYSDATETIMEOFFSET() Příklady v SQL Server (T-SQL)

  2. Jak změním schéma db na dbo

  3. Pomocí MariaDB

  4. 3 způsoby, jak převést desítkové na šestnáctkové v SQL Server (T-SQL)