sql >> Database >  >> RDS >> Sqlserver

Alleen een trigger uitvoeren wanneer een specifieke kolom is bijgewerkt (SQL-server)

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.


  1. Een GDI-bronlek behandelen

  2. Hoe PosgreSQL txid_current() waarde te interpreteren

  3. Hoe kunnen we de grootte van de uitvoerparameter definiëren in de opgeslagen procedure?

  4. Hoe voer ik een bulk in in mySQL met node.js