Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
DDL-Trigger werden als Reaktion auf eine Vielzahl von Ereignissen der Data Definition Language (DDL) ausgelöst. Diese Ereignisse entsprechen in erster Linie Transact-SQL Anweisungen, die mit den Schlüsselwörtern CREATE, ALTER, DROP, GRANT, DENY, REVOKE oder UPDATE STATISTICS beginnen. Bestimmte vom System gespeicherte Prozeduren, die DDL-ähnliche Vorgänge ausführen, können auch DDL-Trigger auslösen.
Verwenden Sie DDL-Trigger, wenn Sie folgendes ausführen möchten:
Verhindern Sie bestimmte Änderungen am Datenbankschema.
Lassen Sie ein Ereignis in der Datenbank als Reaktion auf eine Änderung des Datenbankschemas auslösen.
Zeichnen Sie Änderungen oder Ereignisse im Datenbankschema auf.
Von Bedeutung
Testen Sie Ihre DDL-Trigger, um ihre Antworten auf gespeicherte Systemprozeduren zu ermitteln, die ausgeführt werden. Beispielsweise löst die CREATE TYPE-Anweisung und die gespeicherte sp_addtype-Prozedur einen DDL-Trigger aus, der in einem CREATE_TYPE-Ereignis erstellt wird.
Typen von DDL-Triggern
Transact-SQL DDL-Trigger
Ein spezieller Typ von Transact-SQL gespeicherten Prozedur, die eine oder mehrere Transact-SQL-Anweisungen als Reaktion auf ein Server- oder Datenbankereignis ausführt. Beispielsweise kann ein DDL-Trigger ausgelöst werden, wenn eine Anweisung wie ALTER SERVER CONFIGURATION ausgeführt wird oder eine Tabelle mithilfe von DROP TABLE gelöscht wird.
CLR-DDL-Trigger
Anstatt eine Transact-SQL gespeicherte Prozedur auszuführen, führt ein CLR-Trigger eine oder mehrere Methoden aus, die in verwaltetem Code geschrieben wurden, die Member einer Assembly sind, die im .NET Framework erstellt und in SQL Server hochgeladen wurde.
DDL-Trigger werden erst nach Ausführung der DDL-Anweisungen, die sie auslösen, ausgelöst. DDL-Trigger können nicht als INSTEAD OF-Trigger verwendet werden. DDL-Trigger werden nicht als Reaktion auf Ereignisse ausgelöst, die sich auf lokale oder globale temporäre Tabellen und gespeicherte Prozeduren auswirken.
DDL-Trigger erstellen keine speziellen inserted Und deleted Tabellen.
Die Informationen zu einem Ereignis, das einen DDL-Trigger auslöst, und die nachfolgenden Änderungen, die durch den Trigger verursacht werden, werden mithilfe der EVENTDATA-Funktion erfasst.
Für jedes DDL-Ereignis müssen mehrere Trigger erstellt werden.
Im Gegensatz zu DML-Triggern sind DDL-Trigger nicht auf Schemas begrenzt. Daher können Funktionen wie OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY und OBJECTPROPERTYEX nicht zum Abfragen von Metadaten zu DDL-Triggern verwendet werden. Verwenden Sie stattdessen die Katalogansichten.
DDL-Trigger mit Server-Reichweite werden im SQL Server Management Studio Objekt-Explorer im Ordner Triggers angezeigt. Dieser Ordner befindet sich unter dem Ordner "Serverobjekte ". DDL-Trigger im Datenbankbereich erscheinen im Ordner "Datenbanktrigger". Dieser Ordner befindet sich unter dem Ordner "Programmierbarkeit " der entsprechenden Datenbank.
Von Bedeutung
Bösartiger Code innerhalb von Triggern kann unter eskalierten Berechtigungen ausgeführt werden. Weitere Informationen dazu, wie Sie diese Bedrohung verringern können, finden Sie unter Verwalten der Triggersicherheit.
DDL-Triggerbereich
DDL-Trigger können als Reaktion auf ein Transact-SQL Ereignis ausgelöst werden, das in der aktuellen Datenbank oder auf dem aktuellen Server verarbeitet wird. Der Umfang des Triggers hängt vom Ereignis ab. Ein DDL-Trigger, der als Reaktion auf ein CREATE_TABLE Ereignis ausgelöst wird, kann dies beispielsweise tun, wenn ein CREATE_TABLE Ereignis in der Datenbank oder auf der Serverinstanz auftritt. Ein DDL-Trigger, der als Reaktion auf ein CREATE_LOGIN Ereignis ausgelöst wird, kann dies nur tun, wenn ein CREATE_LOGIN Ereignis in der Serverinstanz auftritt.
Im folgenden Beispiel wird der DDL-Trigger safety ausgelöst, wann immer in der Datenbank ein Ereignis DROP_TABLE oder ALTER_TABLE auftritt.
CREATE TRIGGER safety
ON DATABASE
FOR DROP_TABLE, ALTER_TABLE
AS
PRINT 'You must disable Trigger "safety" to drop or alter tables!'
ROLLBACK;
Im folgenden Beispiel druckt ein DDL-Trigger eine Meldung, wenn ein CREATE_DATABASE Ereignis auf der aktuellen Serverinstanz auftritt. Im Beispiel wird die EVENTDATA Funktion verwendet, um den Text der entsprechenden Transact-SQL-Anweisung abzurufen. Weitere Informationen zur Verwendung von EVENTDATA mit DDL-Triggern finden Sie unter Verwenden der EVENTDATA-Funktion.
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;
GO
Die Listen, die die Transact-SQL Anweisungen den Bereichen zuordnen, die für sie angegeben werden können, sind über die Links im Abschnitt "Auswählen einer bestimmten DDL-Anweisung zum Auslösen eines DDL-Triggers" weiter unten in diesem Thema verfügbar.
Datenbankweite DDL-Trigger werden als Objekte in der jeweiligen Datenbank gespeichert, in der sie erstellt werden. DDL-Trigger können in der Masterdatenbank erstellt werden und verhalten sich genau wie die in benutzerdefinierten Datenbanken erstellten. Sie können Informationen zu DDL-Triggern abrufen, indem Sie die Sys.triggers-Katalogansicht abfragen. Sie können sys.triggers innerhalb des Datenbankkontexts abfragen, in dem die Trigger erstellt werden, oder indem Sie den Datenbanknamen als Bezeichner angeben, z. B. master.sys.triggers.
Server-weite DDL-Trigger werden als Objekte in der Master-Datenbank gespeichert. Sie können jedoch Informationen zu DDL-Triggern mit Serverbereich abrufen, indem Sie die sys.server_triggers Katalogansicht in einem beliebigen Datenbankkontext abfragen.
Angeben einer Transact-SQL Anweisung oder einer Gruppe von Anweisungen
Eine bestimmte DDL-Anweisung auswählen, um einen DDL-Trigger auszulösen
DDL-Trigger können so konzipiert werden, dass sie ausgelöst werden, nachdem eine oder mehrere bestimmte Transact-SQL Anweisungen ausgeführt werden. Im vorherigen Beispiel wird der Trigger safety nach jedem DROP_TABLE- oder ALTER_TABLE-Ereignis ausgelöst. Eine Liste der Transact-SQL-Anweisungen, die angegeben werden können, um einen DDL-Trigger auszulösen, und den Bereich, in dem der Trigger ausgelöst werden kann, finden Sie unter DDL-Ereignisse.
Auswählen einer vordefinierten Gruppe von DDL-Anweisungen zum Auslösen eines DDL-Triggers
Ein DDL-Trigger kann nach der Ausführung eines beliebigen Transact-SQL Ereignisses ausgelöst werden, das zu einer vordefinierten Gruppierung ähnlicher Ereignisse gehört. Wenn beispielsweise ein DDL-Trigger ausgelöst werden soll, nachdem eine CREATE TABLE-, ALTER TABLE- oder DROP TABLE-Anweisung ausgeführt wurde, können Sie FOR DDL_TABLE_EVENTS in der CREATE TRIGGER-Anweisung angeben. Nachdem CREATE TRIGGER ausgeführt wurde, werden die Ereignisse, die von einer Ereignisgruppe abgedeckt werden, der sys.trigger_events Katalogansicht hinzugefügt.
Wenn in SQL Server 2005 ein Trigger für eine Ereignisgruppe erstellt wird, enthält sys.trigger_events keine Informationen zur Ereignisgruppe, sys.trigger_events nur Informationen zu den einzelnen Ereignissen enthält, die von dieser Gruppe abgedeckt werden. In SQL Server 2008 und höher speichert sys.trigger_events Metadaten über die Ereignisgruppe, auf der die Trigger erstellt werden, sowie über die einzelnen Ereignisse, die die Ereignisgruppe abdeckt. Daher gelten Änderungen an den Ereignissen, die von Ereignisgruppen in SQL Server 2008 und höher abgedeckt werden, nicht für DDL-Trigger, die in diesen Ereignisgruppen in SQL Server 2005 erstellt werden.
Eine Liste der vordefinierten Gruppen von DDL-Anweisungen, die für DDL-Trigger verfügbar sind, die speziellen Anweisungen, die die Ereignisgruppen abdecken, und die Bereiche, in denen diese Ereignisgruppen programmiert werden können, finden Sie unter DDL-Ereignisgruppen.
Verwandte Aufgaben
| Aufgabe | Thema |
|---|---|
| Beschreibt, wie DDL-Trigger erstellt, geändert, gelöscht oder deaktiviert werden. | Implementieren von DDL-Triggern |
| Beschreibt, wie ein CLR-DDL-Trigger erstellt wird. | Erstellen von CLR-Triggern |
| Beschreibt, wie Informationen zu DDL-Triggern zurückgegeben werden. | Informationen über DDL-Trigger abrufen |
| Beschreibt, wie Informationen zu einem Ereignis zurückgegeben werden, das einen DDL-Trigger mithilfe der EVENTDATA-Funktion auslöst. | Verwenden der EVENTDATA-Funktion |
| Beschreibt, wie die Triggersicherheit verwaltet wird. | Verwalten der Triggersicherheit |