Entwerfen von DDL-Triggern
Aktualisiert: 12. Dezember 2006
Bevor Sie einen DDL-Trigger entwerfen können, müssen folgende Voraussetzungen erfüllt sein:
- Sie müssen die Grundlagen zum DDL-Triggerbereich kennen.
- Sie müssen festlegen, welche Transact-SQL-Anweisung bzw. Gruppe von Anweisungen den Trigger auslöst.
Sicherheitshinweis: |
---|
Bösartiger Code innerhalb von Triggern kann unter ausgeweiteten Privilegien ausgeführt werden. Weitere Informationen zur Abwehr dieses Sicherheitsrisikos finden Sie unter Verwalten der Triggersicherheit. |
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 ausgelöst. Ein DDL-Trigger, der als Antwort auf ein CREATE LOGIN-Ereignis ausgelöst wird, wird 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 die EVENTDATA
-Funktion zum Abrufen des Textes 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 zu DDL-Triggern können in der sys.triggers-Katalogsicht aus dem Datenbankkontext abgerufen werden, 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 können aus der sys.server_triggers-Katalogsicht in jedem beliebigen Datenbankkontext abgerufen werden.
Weitere Informationen zum Abrufen von Metadaten für DDL-Trigger finden Sie unter Abrufen von Informationen zu DLL-Triggern.
DDL-Trigger werden nicht als Antwort auf Ereignisse ausgelöst, die sich auf lokale oder globale temporäre Tabellen und gespeicherte Prozeduren auswirken.
Angeben einer Transact-SQL-Anweisung oder Gruppe von Anweisungen
Sie können DDL-Trigger erstellen, die als Antwort auf folgende Ereignisse ausgelöst werden:
- Eine oder mehrere bestimmte DDL-Anweisungen
- Eine vordefinierte Gruppe von DDL-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 allen DROP TABLE- oder ALTER TABLE-Ereignissen ausgelöst.
Nicht alle DDL-Ereignisse können zum Auslösen von DDL-Triggern verwendet werden. Einige Ereignisse sind ausschließlich für asynchrone, nicht transaktive Anweisungen konzipiert. Beispielsweise kann ein ADD_ROLE_MEMBER-Ereignis nicht zum Auslösen eines DDL-Triggers verwendet werden. Für diese Ereignisse sollten Sie Ereignisbenachrichtigungen verwenden. Weitere Informationen zu Ereignisbenachrichtigungen finden Sie unter Ereignisbenachrichtigung (Datenbankmodul).
Im Thema DDL-Ereignisse für die Verwendung mit DDL-Triggern ist eine Liste der einzelnen Transact-SQL-Anweisungen enthalten, die für das Auslösen eines DDL-Triggers angegeben werden können. Außerdem wird darin der Bereich angegeben, in dem sie ausgelöst werden können.
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.
Das Thema Ereignisgruppen für die Verwendung mit DLL-Triggern enthält eine Liste der vordefinierten Gruppen von DDL-Anweisungen, die für DDL-Trigger verfügbar sind, die jeweils abgedeckten Anweisungen und die Bereiche, für die diese Ereignisgruppen programmiert werden können.
Siehe auch
Konzepte
Verwenden der EVENTDATA-Funktion
Grundlegendes zu DDL-Triggern
Implementieren von DDL-Triggern
Hilfe und Informationen
Informationsquellen für SQL Server 2005
Änderungsverlauf
Version | Verlauf |
---|---|
12. Dezember 2006 |
|
17. Juli 2006 |
|