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.
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 |
|
Sicherheitshinweis: