Dela via


DML-utlösare

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

DML-utlösaren är en särskild typ av lagrad procedur som automatiskt börjar gälla när en DML-händelse (datamanipuleringsspråk) äger rum som påverkar tabellen eller vyn som definieras i utlösaren. DML-händelser inkluderar INSERT, UPDATEeller DELETE -instruktioner. DML-utlösare kan användas för att framtvinga affärsregler och dataintegritet, köra frågor mot andra tabeller och inkludera komplexa Transact-SQL-instruktioner. Utlösaren och uttrycket som utlöser den behandlas som en enda transaktion, som kan återkallas inifrån utlösaren. Om ett allvarligt fel upptäcks (till exempel otillräckligt diskutrymme) återställs hela transaktionen automatiskt.

Fördelar

DML-utlösare liknar begränsningar eftersom de kan framtvinga entitetsintegritet eller domänintegritet. I allmänhet bör entitetsintegritet alltid upprätthållas på den lägsta nivån av index som är en del av PRIMARY KEY och UNIQUE begränsningar eller skapas oberoende av begränsningar. Domänintegritet bör framtvingas genom CHECK begränsningar och referensintegritet (RI) ska tillämpas genom FOREIGN KEY begränsningar. DML-utlösare är mest användbara när de funktioner som stöds av begränsningar inte kan uppfylla programmets funktionella behov.

I följande lista jämförs DML-utlösare med begränsningar och identifierar när DML-utlösare har fördelar jämfört med begränsningar.

  • DML-utlösare kan överlappa ändringar via relaterade tabeller i databasen. Dessa ändringar kan dock köras mer effektivt med hjälp av sammanhängande begränsningar för referensintegritet. FOREIGN KEY begränsningar kan endast verifiera ett kolumnvärde med en exakt matchning till ett värde i en annan kolumn, såvida inte REFERENCES satsen definierar en sammanhängande referensåtgärd.

  • De kan skydda mot skadliga eller felaktiga INSERT, UPDATE och DELETE operationer, samt framtvinga andra begränsningar som är mer komplexa än begränsningar definierade med CHECK begränsningar.

    Till skillnad från CHECK begränsningar kan DML-utlösare referera till kolumner i andra tabeller. En utlösare kan till exempel använda en parameter från en SELECT annan tabell för att jämföra infogade eller uppdaterade data och utföra andra åtgärder, till exempel ändra data och/eller visa ett användardefinierat felmeddelande.

  • De kan utvärdera tillståndet för en tabell före och efter en dataändring och vidta åtgärder baserat på den skillnaden.

  • Flera DML-utlösare av samma typ (INSERT, UPDATEeller DELETE) i en tabell tillåter flera, olika åtgärder som svar på samma ändringsinstruktor.

  • Begränsningar kan endast kommunicera om fel via standardiserade systemfelmeddelanden. Om programmet kräver eller kan dra nytta av anpassade meddelanden och mer komplex felhantering måste du använda en utlösare.

  • DML-utlösare kan förhindra eller återkalla ändringar som bryter mot referensintegriteten och därmed avbryta försöket att ändra data. En sådan utlösare kan träda i kraft när du ändrar en sekundärnyckel och det nya värdet inte matchar dess primära nyckel. Dock brukar FOREIGN KEY begränsningar vanligtvis användas för detta ändamål.

  • Om det finns begränsningar i utlösartabellen kontrolleras de efter utlösarkörningen INSTEAD OF men före utlösarkörningen AFTER . Om begränsningarna överträds återställs utlösaråtgärderna INSTEAD OF och utlösaren AFTER körs inte.

Typer av DML-utlösare

AFTER-utlösare

AFTER utlösare körs efter att åtgärden för instruktionen INSERT, UPDATE, MERGE, eller DELETE har utförts. AFTER utlösare körs aldrig om en begränsningsöverträdelse inträffar. Därför kan dessa utlösare inte användas för bearbetning som kan förhindra begränsningsöverträdelser. För varje INSERT, UPDATE eller DELETE åtgärd som anges i en MERGE instruktion, aktiveras den motsvarande triggern för varje DML-operation.

I STÄLLET för utlösare

INSTEAD OF utlösare åsidosätter standardåtgärderna för den utlösande satsen. Därför kan de användas för att utföra fel- eller värdekontroll på en eller flera kolumner och utföra andra åtgärder innan du infogar, uppdaterar eller tar bort raden eller raderna. När till exempel värdet som uppdateras i en timlönskolumn i en lönetabell överskrider ett angivet värde kan en utlösare definieras för att antingen skapa ett felmeddelande och återställa transaktionen eller infoga en ny post i en spårningslogg innan posten infogas i lönetabellen. Den främsta fördelen med INSTEAD OF utlösare är att de aktiverar vyer som inte skulle vara uppdaterade för att stödja uppdateringar. En vy som baseras på flera bastabeller måste till exempel använda en INSTEAD OF utlösare för att stödja infogningar, uppdateringar och borttagningar av referensdata i mer än en tabell. En annan fördel med INSTEAD OF utlösare är att de gör att du kan koda logik som kan avvisa delar av en batch samtidigt som andra delar av en batch kan lyckas.

I den här tabellen jämförs funktionerna för AFTER utlösarna och INSTEAD OF .

Funktion AFTER utlösare INSTEAD OF utlösare
Tillämplighet Tabeller Tabeller och vyer
Kvantitet per tabell eller vy Flera per utlösande åtgärd (UPDATE, DELETEoch INSERT) En per utlösande åtgärd (UPDATE, DELETEoch INSERT)
Sammanhängande referenser Inga begränsningar gäller INSTEAD OF UPDATE och DELETE utlösare tillåts inte för tabeller som är mål för kaskaderade begränsningar av referentiell integritet.
Avrättning Efter:

Villkorsbearbetning

Deklarativa referensåtgärder

inserted och deleted tabellskapande

Utlösande åtgärd
Före: Villkorsbearbetning

I stället för: Utlösande åtgärd

Efter skapandet av inserted och deleted tabeller
Körningsordning Första och sista exekveringen kan specificeras Ej tillämpligt
kolumnreferenser för varchar(max), nvarchar(max) och varbinary(max) i inserted tabeller och deleted Tillåtet Tillåtet
text, ntext, och bild kolumnreferenser i inserted och deleted tabeller Tillåts inte Tillåtet

CLR-utlösare

En CLR-utlösare (Common Language Runtime) kan vara antingen en AFTER eller INSTEAD OF utlösare. En CLR-utlösare kan också vara en DDL-utlösare (Data Definition Language). I stället för att köra en Transact-SQL lagrad procedur kör en CLR-utlösare en eller flera metoder skrivna i hanterad kod som är medlemmar i en sammansättning som skapats i .NET Framework och laddats upp i SQL Server.

Aktivitet Artikel
Beskriver hur du skapar en DML-utlösare. Skapa DML-utlösare
Beskriver hur du skapar en CLR-utlösare. Skapa CLR-utlösare
Beskriver hur du skapar en DML-utlösare för att hantera dataändringar med både en rad och flera rader. Skapa DML-utlösare för att hantera flera rader med data
Beskriver hur du kapslar utlösare. Skapa kapslade utlösare
Beskriver hur du anger i vilken AFTER ordning utlösare utlöses. Ange första och sista utlösare
Beskriver hur du använder de särskilda infogade och borttagna tabellerna i triggerkoden. Använd de infogade och borttagna tabellerna
Beskriver hur du ändrar eller byter namn på en DML-utlösare. Ändra eller byt namn på DML-utlösare
Beskriver hur du visar information om DML-utlösare. Hämta information om DML-trigger
Beskriver hur du tar bort eller inaktiverar DML-utlösare. Ta bort eller inaktivera DML-utlösare
Beskriver hur du hanterar utlösarsäkerhet. Hantera utlösarsäkerhet