Entwerfen von DDL-Triggern

Bevor Sie einen DDL-Trigger entwerfen können, müssen folgende Voraussetzungen erfüllt sein:

  • Sie müssen den Bereich des DDL-Triggers verstehen.

  • Sie müssen festlegen, welche Transact-SQL-Anweisung bzw. Gruppe von Anweisungen den Trigger auslösen.

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.

HinweisHinweis

DDL-Trigger werden nicht als Antwort auf Ereignisse ausgelöst, die sich auf lokale oder globale temporäre Tabellen und gespeicherte Prozeduren auswirken.

Grundlegendes zum Triggerbereich

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 auf dem Server 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 Hyperlinks 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 abrufen, 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.

Weitere Informationen zum Abrufen von Metadaten für DDL-Trigger finden Sie unter Abrufen von Informationen zu DLL-Triggern.

Angeben einer Transact-SQL-Anweisung oder Gruppe von Anweisungen

DDL-Trigger können erstellt werden, um als Antwort auf eine oder mehrere bestimmte DDL-Anweisungen oder auf eine vordefinierte Gruppe von DDL-Anweisungen ausgelöst zu werden.

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.

HinweisHinweis

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 enthält sys.trigger_events 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 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.