In SQL Server kunt u DML-triggers maken die alleen code uitvoeren wanneer een specifieke kolom wordt bijgewerkt.
De trigger wordt nog steeds geactiveerd, maar u kunt testen of een specifieke kolom wel of niet is bijgewerkt en vervolgens alleen code uitvoeren als die kolom is bijgewerkt.
U kunt dit doen door de UPDATE()
. te gebruiken functie binnen uw trigger. Deze functie accepteert de kolomnaam als argument. Het geeft een boolean terug.
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
);
En hier is de trigger:
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;
In dit voorbeeld maak ik een tabel met de naam t1
en een trigger genaamd trg_t1
.
Ik gebruik een IF
statement samen met de UPDATE()
functie om te testen of de c1
kolom is bijgewerkt.
Wanneer de trigger wordt uitgevoerd, wordt de volgende code alleen uitgevoerd als die voorwaarde waar is.
Vuur de trekker af
Laten we een rij invoegen, maar we zullen alleen een waarde invoegen in de c1
kolom.
INSERT INTO t1 (c1)
VALUES (1);
SELECT * FROM t1;
Resultaat:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 1 | 0 | 1 | +------+------+------+------+
Zoals verwacht werd de trigger geactiveerd en de kolom c3
werd ook bijgewerkt.
Dit gebeurde omdat ik de INSERT
. heb toegevoegd argument in de definitie van mijn trigger (d.w.z. ik heb AFTER INSERT, UPDATE
opgegeven wat betekent dat de trigger wordt geactiveerd wanneer gegevens worden ingevoegd of bijgewerkt). Als ik alleen AFTER UPDATE
had opgegeven , het zou niet zijn geactiveerd toen ik gegevens invoegde - het zou alleen worden geactiveerd wanneer ik bestaande gegevens bijwerk.
Onthoud dat de tabel is gedefinieerd met DEFAULT 0
, dus de kolom c2 is standaard nul.
Laten we nu de c1
. updaten kolom.
UPDATE t1
SET c1 = c1 + 1
WHERE id = 1;
SELECT * FROM t1;
Resultaat:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 2 | 0 | 2 | +------+------+------+------+
Nogmaals, de c3
kolom is bijgewerkt samen met c1
.
Laten we nu een update doen van de c2
kolom (deze kolom is niet opgenomen in de trigger).
UPDATE t1
SET c2 = c2 + 1
WHERE id = 1;
SELECT * FROM t1;
Resultaat:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 2 | 1 | 2 | +------+------+------+------+
Dus deze keer c2
is bijgewerkt maar c3
was niet. Dat komt omdat de c1
kolom is niet bijgewerkt en onze trigger werkt alleen c3
. bij wanneer c1
is bijgewerkt.
Hetzelfde zou zijn gebeurd als we een rij hadden ingevoegd zonder c1 op te geven in de INSERT
verklaring.
Wat als ik de kolom bijwerk met dezelfde waarde?
Als u een kolom bijwerkt met dezelfde waarde, wordt de UPDATE()
functie zal true retourneren.
Hier is een voorbeeld.
Uit onze eerdere voorbeelden weten we dat de kolom c1 een waarde van 2
. bevat .
Laten we die kolom expliciet bijwerken met dezelfde waarde:1
UPDATE t1
SET c1 = 2
WHERE id = 1;
SELECT * FROM t1;
Resultaat:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 2 | 1 | 3 | +------+------+------+------+
Dus nu c3
is verhoogd, hoewel de waarde voor c1
is nog steeds hetzelfde.
Laten we het opnieuw doen, maar deze keer instellen op zichzelf (d.w.z. verander c1 = 1
naar c1 = c1
).
UPDATE t1
SET c1 = c1
WHERE id = 1;
SELECT * FROM t1;
Resultaat:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 2 | 1 | 4 | +------+------+------+------+
Nogmaals, c3
is toegenomen.
Onsuccesvolle updatepogingen
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.