Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
DDL utlöser eld som svar på olika DDL-händelser (Data Definition Language). Dessa händelser motsvarar främst Transact-SQL -instruktioner som börjar med nyckelorden CREATE, , DROPALTER, GRANT, DENY, REVOKEeller UPDATE STATISTICS. Vissa system lagrade procedurer som utför DDL-liknande åtgärder kan också utlösa DDL-utlösare.
Använd DDL-utlösare när du vill utföra följande uppgifter:
- Förhindra vissa ändringar i databasschemat.
- Få något att hända i databasen som svar på en ändring i databasschemat.
- Registrera ändringar eller händelser i databasschemat.
Viktigt!
Testa DDL-utlösarna för att fastställa deras svar på system lagrade procedurer som körs. Instruktionen CREATE TYPE och den lagrade proceduren sp_addtype utlöser båda en DDL-utlösare, som skapas vid en CREATE_TYPE-händelse.
Typer av DDL-utlösare
Transact-SQL utlösare
En särskild typ av Transact-SQL lagrad procedur som kör en eller flera Transact-SQL-instruktioner som svar på en händelse med serveromfattning eller databasomfattning. En DDL-trigger kan till exempel utlösas om ett uttryck som ALTER SERVER CONFIGURATION körs eller om en tabell tas bort med hjälp av DROP TABLE.
CLR-utlösare
I stället för att köra en Transact-SQL lagrad procedur kör en CLR-utlösare (Common Language Runtime) 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.
DDL-utlösare aktiveras först efter att de DDL-instruktioner som utlöser dem har körts. DDL-utlösare kan inte användas som INSTEAD OF utlösare. DDL-utlösare utlöses inte som svar på händelser som påverkar lokala eller globala temporära tabeller och lagrade procedurer.
DDL-utlösare skapar inte de speciella inserted- och deleted-tabellerna.
Informationen om en händelse som utlöser en DDL-utlösare och efterföljande ändringar som orsakas av utlösaren registreras med hjälp av EVENTDATA-funktionen.
Flera utlösare som ska skapas för varje DDL-händelse.
Till skillnad från DML-utlösare (Data Manipulation Language) är DDL-utlösare inte begränsade till scheman. Därför kan funktioner som OBJECT_ID, OBJECT_NAME, OBJECTPROPERTYoch OBJECTPROPERTYEX inte användas för att fråga metadata om DDL-utlösare. Använd katalogvyerna i stället.
DDL-utlösare med serveromfattning visas i SQL Server Management Studio Object Explorer i mappen Utlösare . Den här mappen finns under mappen Serverobjekt . DDL-utlösare med databasomfattning visas i mappen Databasutlösare . Den här mappen finns under mappen Programmability för motsvarande databas.
Viktigt!
Skadlig kod inuti utlösare kan köras under eskalerade privilegier. Mer information om hur du kan minska det här hotet finns i Hantera utlösarsäkerhet.
DDL-utlösarens omfång
DDL-utlösare kan utlösas som svar på en Transact-SQL händelse som bearbetas i den aktuella databasen eller på den aktuella servern. Utlösarens omfång beror på händelsen. Till exempel kan en DDL-utlösare som skapats för att utlösas som svar på en CREATE_TABLE händelse göra det när en CREATE_TABLE händelse inträffar i databasen eller på serverinstansen. En DDL-utlösare som skapats för att utlösas som svar på en CREATE_LOGIN händelse kan bara göra det när en CREATE_LOGIN händelse inträffar i serverinstansen.
I följande exempel utlöses DDL-utlösaren safety när en DROP_TABLE eller ALTER_TABLE händelse inträffar i databasen.
CREATE TRIGGER safety
ON DATABASE
FOR DROP_TABLE, ALTER_TABLE
AS PRINT 'You must disable trigger "safety" to drop or alter tables!';
ROLLBACK;
I följande exempel skriver en DDL-utlösare ut ett meddelande om någon CREATE_DATABASE händelse inträffar på den aktuella serverinstansen. I exemplet används EVENTDATA funktionen för att hämta texten i motsvarande Transact-SQL-instruktion. Mer information om hur du använder EVENTDATA med DDL-utlösare finns i Använda funktionen EVENTDATA.
IF EXISTS (SELECT *
FROM sys.server_triggers
WHERE name = 'ddl_trig_database')
DROP TRIGGER ddl_trig_database
ON ALL SERVER;
GO
CREATE TRIGGER ddl_trig_database
ON ALL SERVER
FOR CREATE_DATABASE
AS PRINT 'Database Created.';
SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'nvarchar(max)');
GO
DROP TRIGGER ddl_trig_database
ON ALL SERVER;
De listor som mappar Transact-SQL-instruktionerna till de omfång som kan anges för dem är tillgängliga via länkarna i avsnittet Välj en viss DDL-instruktion för att utlösa en DDL-utlösare senare i den här artikeln.
DDL-utlösare med databasomfattning lagras som objekt i databasen där de skapas. DDL-utlösare kan skapas i master databasen och fungera precis som de som skapats i användardesignade databaser. Du kan hämta information om DDL-utlösare genom att göra en förfrågan på katalogvyn sys.triggers. Du kan fråga sys.triggers i databaskontexten där utlösarna skapas eller genom att ange databasnamnet som en identifierare, till exempel master.sys.triggers.
DDL-utlösare med serveromfattning lagras som objekt i master databasen. Du kan dock hämta information om serveromfattande DDL-utlösare genom att fråga katalogvyn i valfri databaskontext.
Ange en Transact-SQL-instruktion eller grupp med instruktioner
Välj en specifik DDL-instruktion för att aktivera en DDL-utlösare
DDL-utlösare kan utformas för att utlösas när en eller flera specifika Transact-SQL-instruktioner har körts. I föregående exempel utlöses safety efter valfri DROP_TABLE eller ALTER_TABLE händelse. Listor över de Transact-SQL-instruktioner som kan anges för att utlösa en DDL-utlösare och det omfång där utlösaren kan utlösas finns i DDL-händelser.
Välj en fördefinierad grupp med DDL-satser för att utlösa en DDL-trigger
En DDL-utlösare kan utlösas efter körning av alla Transact-SQL händelser som tillhör en fördefinierad gruppering av liknande händelser. Om du till exempel vill att en DDL-utlösare ska aktiveras efter att någon CREATE TABLE, ALTER TABLE eller DROP TABLE-instruktion har körts, kan du ange FOR DDL_TABLE_EVENTS i CREATE TRIGGER-instruktionen. När CREATE TRIGGER har körts läggs de händelser som omfattas av en händelsegrupp till i sys.trigger_events katalogvyn.
I SQL Server 2005 (9.x), om en utlösare skapas i en händelsegrupp, sys.trigger_events innehåller inte information om händelsegruppen, sys.trigger_events innehåller endast information om de enskilda händelser som omfattas av den gruppen.
sys.trigger_events bevarar metadata om den händelsegrupp där utlösaren skapas och även om de enskilda händelser som händelsegruppen omfattar. Därför gäller inte ändringar av de händelser som omfattas av händelsegrupper för DDL-utlösare i de senaste versionerna av SQL Server som har skapats på dessa händelsegrupper i SQL Server 2005 (9.x).
En lista över fördefinierade grupper av DDL-instruktioner som är tillgängliga för DDL-utlösare, de specifika instruktioner som händelsegrupperna omfattar och de omfång där dessa händelsegrupper kan programmeras finns i DDL-händelsegrupper.
Relaterade uppgifter
| Aktivitet | Artikel |
|---|---|
| Beskriver hur du skapar, ändrar, tar bort eller inaktiverar DDL-utlösare. | Implementera DDL-utlösare |
| Beskriver hur du skapar en CLR DDL-utlösare. | Skapa CLR-utlösare |
| Beskriver hur du returnerar information om DDL-utlösare. | Hämta information om DDL-utlösare |
Beskriver hur du returnerar information om en händelse som aktiverar en DDL-utlösare med hjälp av funktionen EVENTDATA. |
Använda funktionen EVENTDATA |
| Beskriver hur du hanterar utlösarsäkerhet. | Hantera utlösarsäkerhet |