DDL-Trigger

DDL-Trigger werden als Reaktion auf verschiedene DDL-Ereignisse (Data Definition Language, Datendefinitionssprache) ausgeführt. Diese Ereignisse entsprechen hauptsächlich Transact-SQL-Anweisungen, die mit den Schlüsselwörtern CREATE, ALTER, DROP, GRANT, DENY, REVOKE oder UPDATE STATISTICS beginnen. Bestimmte gespeicherte Systemprozeduren, durch die DDL-ähnliche Vorgänge ausgeführt werden, können ebenfalls DDL-Trigger auslösen.

Sie können DDL-Trigger für die folgenden Aufgaben verwenden:

  • Verhindern bestimmter Änderungen am Datenbankschema

  • Als Antwort auf eine Änderung im Datenbankschema soll ein bestimmtes Ereignis auftreten.

  • Aufzeichnen von Änderungen oder Ereignissen im Datenbankschema

Wichtiger HinweisWichtig

Testen Sie die DDL-Trigger, um ihre Reaktionen auf ausgeführte, gespeicherte Systemprozeduren zu ermitteln. Beispielsweise wird durch die CREATE TYPE-Anweisung ebenso wie durch die gespeicherte Prozedur sp_addtype ein DDL-Trigger ausgelöst, der für ein CREATE_TYPE-Ereignis erstellt wurde.

DDL-Triggertypen

  • DDL-Trigger für Transact-SQL
    Ein besonderer Typ der gespeicherten Transact-SQL-Prozedur, der mindestens eine Transact-SQL-Anweisung als Reaktion auf ein Ereignis aus dem Bereich des Servers oder der Datenbank ausführt. Beispielsweise wird ein DDL-Trigger möglicherweise ausgelöst, wenn z. B. eine ALTER SERVER CONFIGURATION-Anweisung ausgeführt wird, oder wenn eine Tabelle mit DROP TABLE gelöscht wird.

  • CLR-DDL-Trigger
    Anstatt eine gespeicherte Transact-SQL-Prozedur auszuführen, führt ein CLR-Trigger eine oder mehrere Methoden aus, die in verwaltetem Code geschrieben wurden und Elemente einer Assembly sind, die in .NET Framework erstellt und in SQL Server hochgeladen werden.

DDL-Trigger werden nur ausgelöst, nachdem die DDL-Anweisungen ausgeführt werden, die diese Trigger auslösen. DDL-Trigger können nicht als INSTEAD OF-Trigger verwendet werden. DDL-Trigger werden nicht als Antwort auf Ereignisse ausgelöst, die sich auf lokale oder globale temporäre Tabellen und gespeicherte Prozeduren auswirken.

DDL-Trigger erstellen nicht die speziellen inserted- und deleted-Tabellen.

Die Informationen zu einem Ereignis, das einen DDL-Trigger auslöst, sowie zu den nachfolgenden Änderungen, die der Trigger verursacht, werden mit der EVENTDATA-Funktion aufgezeichnet.

Für jedes DDL-Ereignis sollen mehrere Trigger erstellt werden.

Im Gegensatz zu DML-Triggern werden für DDL-Trigger keine Schemas als Bereiche festgelegt. Aus diesem Grund können Funktionen wie OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY und OBJECTPROPERTYEX nicht verwendet werden, um Metadaten aus DDL-Triggern abzufragen. Verwenden Sie stattdessen Katalogsichten.

DDL-Trigger mit Serverbereich werden im Objekt-Explorer von SQL Server Management Studio Object Explorer im Ordner Trigger angezeigt. Dieser Ordner befindet sich unter dem Ordner Serverobjekte. DDL-Trigger mit Datenbankbereich werden im Ordner Datenbanktrigger angezeigt. Dieser Ordner befindet sich unter dem Ordner Programmierbarkeit der entsprechenden Datenbank.

SicherheitshinweisSicherheitshinweis

Bösartiger Code innerhalb von Triggern kann unter ausgeweiteten Privilegien ausgeführt werden. Weitere Informationen dazu, wie Sie diese Bedrohung minimieren, finden Sie unter Verwalten der Triggersicherheit.

DDL-Trigger-Bereich

DDL-Trigger können als Antwort auf ein Transact-SQL-Ereignis ausgelöst werden, das in der aktuellen Datenbank oder auf dem aktuellen Server verarbeitet wird. Der Bereich des Triggers hängt von dem Ereignis ab. Ein DDL-Trigger, der als Antwort auf ein CREATE_TABLE-Ereignis ausgelöst wird, wird z. B. bei jedem Auftreten eines CREATE_TABLE-Ereignisses in der Datenbank oder der Serverinstanz ausgelöst. Ein DDL-Trigger, der als Antwort auf ein CREATE_LOGIN-Ereignis ausgelöst wird, wird nur bei jedem Auftreten eines CREATE_LOGIN-Ereignisses in der Serverinstanz ausgelöst.

Im folgenden Beispiel wird der DDL-Trigger safety immer dann ausgelöst, wenn ein DROP_TABLE-Ereignis oder ein ALTER_TABLE-Ereignis in der Datenbank 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 nächsten Beispiel wird von einem DDL-Trigger eine Meldung ausgegeben, wenn ein CREATE_DATABASE-Ereignis für die aktuelle Serverinstanz auftritt. Für den Trigger wird beispielsweise die EVENTDATA-Funktion zum Abrufen des Texts der entsprechenden Transact-SQL-Anweisung verwendet. Weitere Informationen zum Verwenden 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, mit denen die Transact-SQL-Anweisungen den Bereichen zugeordnet werden, die für diese angegeben werden können, stehen über die Links im Abschnitt "Auswählen einer bestimmten DDL-Anweisung für das Auslösen eines DDL-Triggers" weiter unten in diesem Thema zur Verfügung.

DDL-Trigger im Datenbankbereich werden als Objekte in der Datenbank gespeichert, in der sie erstellt werden. DDL-Trigger können in der Master-Datenbank erstellt werden und verhalten sich ebenso wie Trigger, die in benutzerdefinierten Datenbanken erstellt wurden. Informationen über DDL-Trigger erhalten Sie, indem Sie die sys.triggers-Katalogsicht abfragen. Sie können sys.triggers innerhalb des Datenbankkontexts abfragen, in dem sie erstellt werden. Sie können jedoch auch den Datenbanknamen als Bezeichner angeben (z. B. master.sys.triggers).

DDL-Trigger im Serverbereich werden als Objekte in der master-Datenbank gespeichert. Informationen zu DDL-Triggern im Serverbereich erhalten Sie durch Abfragen der sys.server_triggers-Katalogsicht in jedem beliebigen Datenbankkontext.

Angeben einer Transact-SQL-Anweisung oder Gruppe von Anweisungen

Auswählen einer bestimmten DDL-Anweisung für das Auslösen eines DDL-Triggers

DDL-Trigger können so entworfen werden, dass ihre Auslösung nach der Ausführung einer oder mehrerer Transact-SQL-Anweisungen erfolgt. Im vorherigen Beispiel wird der Trigger safety nach einem DROP_TABLE-Ereignis oder einem ALTER_TABLE-Ereignis ausgelöst. Listen der Transact-SQL-Anweisungen, die für das Auslösen eines DDL-Triggers angegeben werden können, sowie den Bereich, in dem sie ausgelöst werden können, finden Sie unter DDL-Ereignisse.

Auswählen einer vordefinierten Gruppe von DDL-Anweisungen für das 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 Gruppe ähnlicher Ereignisse gehört. Wenn ein DDL-Trigger z. B. nach jeder Ausführung einer CREATE TABLE-, ALTER TABLE- oder DROP TABLE-Anweisung ausgelöst werden soll, können Sie FOR DDL_TABLE_EVENTS in der CREATE TRIGGER-Anweisung angeben. Nachdem CREATE TRIGGER ausgeführt wurde, werden die von einer Ereignisgruppe abgedeckten Ereignisse der sys.trigger_events-Katalogsicht hinzugefügt.

Wenn in SQL Server 2005 ein Trigger für eine Ereignisgruppe erstellt wird, enthält sys.trigger_events keine Informationen über die Ereignisgruppe. sys.trigger_events enthält nur Informationen über die einzelnen von dieser Gruppe abgedeckten Ereignisse. In SQL Server 2008 und höher speichert sys.trigger_events persistent Metadaten über die Ereignisgruppe, für die der Trigger erstellt wird, sowie über die einzelnen Ereignisse, die die Ereignisgruppe abdeckt. Daher gelten Änderungen der von diesen Ereignisgruppen in SQL Server 2008 und höher abgedeckten Ereignissen nicht für DDL-Trigger, die für diese Ereignisgruppen in SQL Server 2005 erstellt werden.

Eine Liste der vordefinierten Gruppen von DDL-Anweisungen, die für DDL-Trigger verfügbar sind, die jeweils von den Ereignisgruppen abgedeckten Anweisungen und die Bereiche, für die diese Ereignisgruppen programmiert werden können, finden Sie unter DDL-Ereignisgruppen.

Verwandte Aufgaben

Task

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.

Abrufen von Informationen zu DDL-Triggern

Beschreibt, wie Informationen zu einem Ereignis, das einen DDL-Trigger auslöst, mithilfe der EVENTDATA-Funktion zurückgegeben werden.

Verwenden der EVENTDATA-Funktion

Beschreibt, wie Triggersicherheit verwaltet wird.

Verwalten der Triggersicherheit

Siehe auch

Verweis

CREATE TRIGGER (Transact-SQL)

Konzepte

DML-Trigger

Logon-Trigger