Delen via


DML-triggers

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

De DML-trigger is een speciaal type opgeslagen procedure dat automatisch van kracht wordt wanneer een DML-gebeurtenis (Data Manipulat Language) plaatsvindt die van invloed is op de tabel of weergave die in de trigger is gedefinieerd. DML-gebeurtenissen bevatten INSERT, UPDATEof DELETE instructies. DML-triggers kunnen worden gebruikt om bedrijfsregels en gegevensintegriteit af te dwingen, andere tabellen op te vragen en complexe Transact-SQL instructies op te nemen. De trigger en de instructie die deze activeert, worden behandeld als één transactie, die vanuit de trigger kan worden teruggedraaid. Als er een ernstige fout wordt gedetecteerd (bijvoorbeeld onvoldoende schijfruimte), wordt de hele transactie automatisch teruggedraaid.

Voordelen

DML-triggers zijn vergelijkbaar met beperkingen omdat ze entiteitsintegriteit of domeinintegriteit kunnen afdwingen. In het algemeen moet entiteitsintegriteit altijd worden afgedwongen op het laagste niveau door indexen die deel uitmaken van PRIMARY KEY en UNIQUE beperkingen of onafhankelijk van beperkingen worden gemaakt. Domeinintegriteit moet worden afgedwongen via CHECK beperkingen en referentiële integriteit (RI) moet worden afgedwongen via FOREIGN KEY beperkingen. DML-triggers zijn het handigst wanneer de functies die worden ondersteund door beperkingen, niet aan de functionele behoeften van de toepassing kunnen voldoen.

De volgende lijst vergelijkt DML-triggers met beperkingen en identificeert wanneer DML-triggers voordelen hebben ten opzichte van beperkingen.

  • DML-triggers kunnen wijzigingen trapsgewijs doorvoeren via gerelateerde tabellen in de database; Deze wijzigingen kunnen echter efficiënter worden uitgevoerd met trapsgewijze referentiële integriteitsbeperkingen. FOREIGN KEY beperkingen kunnen een kolomwaarde alleen valideren met een exacte overeenkomst met een waarde in een andere kolom, tenzij de REFERENCES component een trapsgewijze referentiële actie definieert.

  • Ze kunnen beschermen tegen kwaadwillende of onjuiste INSERT, UPDATEen DELETE bewerkingen en andere beperkingen afdwingen die complexer zijn dan beperkingen die zijn gedefinieerd met CHECK beperkingen.

    In tegenstelling tot CHECK beperkingen kunnen DML-triggers verwijzen naar kolommen in andere tabellen. Een trigger kan bijvoorbeeld een element uit een andere tabel gebruiken om te vergelijken met de ingevoegde of bijgewerkte gegevens, en om andere acties uit te voeren, zoals het wijzigen van de gegevens of het weergeven van een foutmelding die door de gebruiker is gedefinieerd.

  • Ze kunnen de status van een tabel vóór en na het wijzigen van gegevens evalueren en acties uitvoeren op basis van dat verschil.

  • Meerdere DML-triggers van hetzelfde type (INSERT, UPDATEof DELETE) in een tabel maken meerdere, verschillende acties mogelijk als reactie op dezelfde wijzigingsinstructie.

  • Beperkingen kunnen alleen communiceren over fouten via gestandaardiseerde systeemfoutberichten. Als uw toepassing aangepaste berichten en complexere foutafhandeling vereist of baat kan hebben bij, dient u een trigger te gebruiken.

  • DML-triggers kunnen wijzigingen die referentiële integriteit schenden, niet toestaan of terugdraaien, waardoor de poging tot wijziging van gegevens wordt geannuleerd. Een dergelijke trigger wordt mogelijk van kracht wanneer u een vreemde sleutel wijzigt en de nieuwe waarde niet overeenkomt met de primaire sleutel. FOREIGN KEY Voor dit doel worden echter meestal beperkingen gebruikt.

  • Als er beperkingen bestaan in de triggertabel, worden deze gecontroleerd na de uitvoering van de INSTEAD OF trigger, maar vóór de AFTER triggeruitvoering. Als de beperkingen worden geschonden, worden de INSTEAD OF triggeracties teruggedraaid en wordt de AFTER trigger niet uitgevoerd.

Typen DML-trigger

Achter trigger

AFTERtriggers worden uitgevoerd nadat de actie van de INSERTUPDATE, of MERGEDELETE instructie is uitgevoerd. AFTER triggers worden nooit uitgevoerd als er een schending van een beperking optreedt. Deze triggers kunnen daarom niet worden gebruikt voor verwerkingen die schendingen van beperkingen kunnen voorkomen. Voor elke INSERT, UPDATEof DELETE actie die is opgegeven in een MERGE instructie, wordt de bijbehorende trigger geactiveerd voor elke DML-bewerking.

IN PLAATS VAN trigger

INSTEAD OF triggers overschrijven de standaardacties van de triggerende instructie. Daarom kunnen ze worden gebruikt om fout- of waardecontrole uit te voeren op een of meer kolommen en andere acties uit te voeren voordat u de rij of rijen invoegt, bijwerkt of verwijdert. Wanneer bijvoorbeeld de waarde die wordt bijgewerkt in een kolom met een uurloon in een salaristabel een opgegeven waarde overschrijdt, kan een trigger worden gedefinieerd om een foutbericht te genereren en de transactie terug te draaien, of een nieuwe record in te voegen in een audittrail voordat u de record in de salaristabel invoegt. Het belangrijkste voordeel van INSTEAD OF triggers is dat ze weergaven inschakelen die niet kunnen worden bijgewerkt om updates te ondersteunen. Een weergave op basis van meerdere basistabellen moet bijvoorbeeld een INSTEAD OF trigger gebruiken ter ondersteuning van invoegingen, updates en verwijderingen die verwijzen naar gegevens in meer dan één tabel. Een ander voordeel van INSTEAD OF triggers is dat u codelogica kunt gebruiken waarmee onderdelen van een batch kunnen worden geweigerd, terwijl andere onderdelen van een batch kunnen slagen.

Deze tabel vergelijkt de functionaliteit van de AFTER en INSTEAD OF triggers.

Functie AFTER trigger INSTEAD OF trigger
Toepasselijkheid Tabellen Tabellen en weergaven
Hoeveelheid per tabel of weergave Meerdere acties per triggeractie (UPDATE, DELETEen INSERT) Eén per triggeractie (UPDATE, DELETEen INSERT)
Trapsgewijze verwijzingen Er zijn geen beperkingen van toepassing INSTEAD OF UPDATE en DELETE triggers zijn niet toegestaan voor tabellen die doelen zijn van trapsgewijze beperkingen voor referentiële integriteit.
Uitvoering Na:

Beperkingsverwerking

Declaratieve referentiële acties

inserted en deleted tabellen maken

De triggeractie
Voor: Beperkingsverwerking

In plaats van: De triggeractie

Na: inserted en deleted tabellen maken
Uitvoeringsvolgorde De eerste en laatste uitvoering kunnen worden opgegeven Niet van toepassing
varchar(max), nvarchar(max), en varbinary(max) kolomverwijzingen in inserted en deleted tabellen Toegestaan Toegestaan
text-, ntext- en image-kolomverwijzingen in inserted en deleted tabellen Niet toegestaan Toegestaan

CLR-trigger

Een CLR-trigger (Common Language Runtime) kan een AFTER-trigger of een INSTEAD OF-trigger zijn. Een CLR-trigger kan ook een DDL-trigger (Data Definition Language) zijn. In plaats van een Transact-SQL opgeslagen procedure uit te voeren, voert een CLR-trigger een of meer methoden uit die zijn geschreven in beheerde code die lid zijn van een assembly die is gemaakt in .NET Framework en geüpload in SQL Server.

Opdracht Artikel
Hierin wordt beschreven hoe u een DML-trigger maakt. DML-triggers maken
Beschrijft hoe u een CLR-trigger maakt. CLR-triggers maken
Hierin wordt beschreven hoe u een DML-trigger maakt voor het afhandelen van gegevenswijzigingen met één rij en meerdere rijen. DML-triggers maken voor het afhandelen van meerdere rijen met gegevens
Hierin wordt beschreven hoe u triggers kunt nesten. Geneste triggers maken
Beschrijft hoe u de volgorde opgeeft waarin AFTER triggers worden geactiveerd. Eerste en laatste triggers opgeven
Hierin wordt beschreven hoe u de speciale ingevoegde en verwijdertabellen in triggercode gebruikt. De ingevoegde en verwijderde tabellen gebruiken
Hierin wordt beschreven hoe u een DML-trigger wijzigt of hernoemt. DML-triggers wijzigen of de naam ervan wijzigen
Hierin wordt beschreven hoe u informatie over DML-triggers kunt weergeven. Informatie over DML-triggers ophalen
Hierin wordt beschreven hoe u DML-triggers verwijdert of uitschakelt. DML-triggers verwijderen of uitschakelen
Beschrijft hoe u triggerbeveiliging beheert. Triggerbeveiliging beheren