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.
ms186406.security(de-de,SQL.90).gifSicherheitshinweis:
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

Geänderter Inhalt:
  • Die fehlerhafte Information, dass ein CREATE_DATABASE-Ereignis nicht zum Auslösen eines DDL-Triggers verwendet werden kann, wurde korrigiert. Dieses Ereignis wurde durch ADD_ROLE_MEMBER als Beispiel eines Ereignisses ersetzt, das zum Auslösen einer Ereignisbenachrichtigung verwendet werden kann, jedoch nicht zum Auslösen eines DDL-Triggers.

17. Juli 2006

Geänderter Inhalt:
  • Das zweite Beispiel unter "Grundlegendes zum Triggerbereich" wurde aktualisiert.