sql >> Database >  >> RDS >> Sqlserver

Voer alleen een trigger uit wanneer bepaalde kolommen zijn bijgewerkt (SQL-server)

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 .


  1. Detecteren of waarde een getal is in MySQL

  2. T-SQL dynamische spil

  3. Uitdagingen bij het schalen van de Moodle PostgreSQL-database

  4. java.lang.IllegalArgumentException:kolom '_id' bestaat niet