sql >> Database >  >> RDS >> Sqlserver

Een DML-trigger maken in SQL Server

In SQL Server kunt u de CREATE TRIGGER . gebruiken statement om een ​​trigger te creëren.

Een trigger is een speciaal type opgeslagen procedure die automatisch wordt uitgevoerd wanneer een gebeurtenis plaatsvindt in de databaseserver.

U kunt een DML-trigger, een DDL-trigger of een aanmeldingstrigger maken.

Dit artikel geeft een voorbeeld van het maken van een DML-trigger.

Wat is een DML-trigger?

Een DML-trigger is een trigger die wordt uitgevoerd wanneer een gebruiker probeert gegevens te wijzigen via een DML-gebeurtenis (Data Manipulation Language).

DML-gebeurtenissen omvatten INSERT , UPDATE , of DELETE verklaringen. DML-triggers kunnen worden gebruikt om bedrijfsregels en gegevensintegriteit af te dwingen, andere tabellen te doorzoeken en complexe T-SQL-instructies op te nemen.

De trigger en de instructie die deze activeert, worden behandeld als een enkele transactie, die vanuit de trigger kan worden teruggedraaid.

Voorbeeld

Hier is een voorbeeld om te laten zien hoe DML-triggers werken.

CREATE TABLE t1 (
    id int IDENTITY(1,1) NOT NULL,
    c1 int DEFAULT 0,
    c2 int DEFAULT 0,
    c3 int DEFAULT 0
);

CREATE TRIGGER trg_t1
ON t1
AFTER INSERT, UPDATE
AS
UPDATE t1
SET c3 = c3 + 1
WHERE id IN (SELECT DISTINCT id FROM inserted);

In dit voorbeeld maak ik een tabel aan en maak ik ook een trigger die wordt geactiveerd wanneer een rij in die tabel wordt ingevoegd of bijgewerkt.

In dit geval voegt de trigger 1 toe aan de c3 kolom telkens wanneer gegevens worden ingevoegd of bijgewerkt.

Ik noemde de trigger trg_t1 . Ik volgde dat deel met ON t1 , wat betekent dat de trigger wordt uitgevoerd op de tabel met de naam t1 .

U kunt ook een weergave specificeren waarop de trigger moet worden uitgevoerd, hoewel u alleen naar een weergave kunt verwijzen met een INSTEAD OF trigger (vervang in dit geval AFTER met INSTEAD OF ). U kunt ook geen DML-triggers definiëren op lokale of globale tijdelijke tabellen.

AFTER geeft aan dat de DML-trigger alleen wordt geactiveerd wanneer alle bewerkingen die zijn opgegeven in de activerende SQL-instructie met succes zijn gestart. U kunt ook FOR . specificeren hier.

Een ander alternatief is om INSTEAD OF . te gebruiken , die de trigger in plaats daarvan zal uitvoeren van de triggerende SQL-instructie. Dit heeft dus voorrang op de acties van de activerende instructies.

Wat is de inserted Tafel?

In mijn trigger kan ik achterhalen welke rij is bijgewerkt door de inserted op te vragen tafel.

SQL Server maakt en beheert een tabel met de naam inserted , wat een tijdelijke, geheugenresidente tabel is die kopieën van de betrokken rijen opslaat tijdens INSERT en UPDATE verklaringen. Tijdens een invoeg- of bijwerktransactie worden nieuwe rijen toegevoegd aan zowel de inserted tafel en de triggertafel. De rijen in de ingevoegde tabel zijn kopieën van de nieuwe rijen in de triggertabel.

SQL Server maakt en onderhoudt ook een vergelijkbare tabel met de naam verwijderd, waarin kopieën van de betrokken rijen worden opgeslagen tijdens DELETE en UPDATE verklaringen. Tijdens het uitvoeren van een DELETE of UPDATE statement, worden rijen verwijderd uit de triggertabel en overgebracht naar de verwijderde tabel.

Voer de trigger uit

Nu de tabel en zijn trigger zijn gemaakt, laten we enkele SQL-instructies uitvoeren die de tabel zullen activeren.

INSERT INTO t1 (c1) 
VALUES (1);

SELECT * FROM t1;

Resultaat:

+------+------+------+------+
| id   | c1   | c2   | c3   |
|------+------+------+------|
| 1    | 1    | 0    | 1    |
+------+------+------+------+

Dus we kunnen zien dat de trigger werkte zoals verwacht. Toen ik een rij invoegde, heb ik alleen een waarde opgegeven voor de c1 kolom, maar de trigger zorgde ervoor dat de c3 kolom is ook bijgewerkt.

Merk op dat de standaardwaarde voor alle kolommen 0 is (zoals gespecificeerd toen ik de tabel maakte), en de trigger voegde daar 1 aan toe.

Laten we een UPDATE uitvoeren bewerking op dezelfde 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 ook bijgewerkt door de trigger.

Laten we nu de c2 . updaten kolom.

UPDATE t1 
SET c2 = c2 + 1
WHERE id = 1;

SELECT * FROM t1;

Resultaat:

+------+------+------+------+
| id   | c1   | c2   | c3   |
|------+------+------+------|
| 1    | 2    | 1    | 3    |
+------+------+------+------+

Dus nogmaals, de c3 kolom wordt bijgewerkt door de trigger.

Deze specifieke trigger wordt geactiveerd wanneer een andere kolom in dezelfde rij wordt bijgewerkt.

U kunt ook IF UPDATE(column_name) . gebruiken om te controleren op een update van een enkele kolom, of COLUMNS_UPDATED() om te controleren op updates in meerdere kolommen.


  1. MYSQL sum() voor verschillende rijen

  2. Meerdere (3+) tabellen samenvoegen in één verklaring

  3. Een variabele declareren en weergeven in Oracle

  4. SQLT in 12c kan geen statistieken verzamelen