DDL-TriggerDDL Triggers

Gilt für: JaSQL Server JaAzure SQL-Datenbank NeinAzure Synapse Analytics (SQL DW) NeinParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

DDL-Trigger werden als Reaktion auf verschiedene DDL-Ereignisse (Data Definition Language, Datendefinitionssprache) ausgeführt.DDL triggers fire in response to a variety of Data Definition Language (DDL) events. Diese Ereignisse entsprechen hauptsächlich Transact-SQLTransact-SQL -Anweisungen, die mit den Schlüsselwörtern CREATE, ALTER, DROP, GRANT, DENY, REVOKE oder UPDATE STATISTICS beginnen.These events primarily correspond to Transact-SQLTransact-SQL statements that start with the keywords CREATE, ALTER, DROP, GRANT, DENY, REVOKE or UPDATE STATISTICS. Bestimmte gespeicherte Systemprozeduren, die DDL-ähnliche Vorgänge ausführen, können ebenfalls DDL-Trigger auslösen.Certain system stored procedures that perform DDL-like operations can also fire DDL triggers.

Sie können DDL-Trigger für die folgenden Aufgaben verwenden:Use DDL triggers when you want to do the following:

  • Verhindern bestimmter Änderungen am DatenbankschemaPrevent certain changes to your database schema.

  • Als Antwort auf eine Änderung im Datenbankschema soll ein bestimmtes Ereignis auftreten.Have something occur in the database in response to a change in your database schema.

  • Aufzeichnen von Änderungen oder Ereignissen im DatenbankschemaRecord changes or events in the database schema.

Wichtig

Testen Sie die DDL-Trigger, um ihre Reaktionen auf ausgeführte, gespeicherte Systemprozeduren zu ermitteln.Test your DDL triggers to determine their responses to system stored procedures that are run. 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.For example, the CREATE TYPE statement and the sp_addtype stored procedure will both fire a DDL trigger that is created on a CREATE_TYPE event.

DDL-TriggertypenTypes of DDL Triggers

DDL-Trigger für Transact-SQLTransact-SQL DDL Trigger

Ein besonderer Typ der gespeicherten Transact-SQLTransact-SQL-Prozedur, der mindestens eine Transact-SQLTransact-SQL-Anweisung als Reaktion auf ein Ereignis aus dem Bereich des Servers oder der Datenbank ausführt.A special type of Transact-SQLTransact-SQL stored procedure that executes one or more Transact-SQLTransact-SQL statements in response to a server-scoped or database-scoped event. 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.For example, a DDL Trigger may fire if a statement such as ALTER SERVER CONFIGURATION is executed or if a table is deleted by using DROP TABLE.

CLR-DDL-TriggerCLR DDL Trigger

Anstatt eine gespeicherte Transact-SQLTransact-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 ServerSQL Serverhochgeladen werden.Instead of executing a Transact-SQLTransact-SQL stored procedure, a CLR trigger executes one or more methods written in managed code that are members of an assembly created in the .NET Framework and uploaded in SQL ServerSQL Server.

DDL-Trigger werden nur ausgelöst, nachdem die DDL-Anweisungen ausgeführt werden, die diese Trigger auslösen.DDL triggers fire only after the DDL statements that trigger them are run. DDL-Trigger können nicht als INSTEAD OF-Trigger verwendet werden.DDL triggers cannot be used as INSTEAD OF triggers. DDL-Trigger werden nicht als Antwort auf Ereignisse ausgelöst, die sich auf lokale oder globale temporäre Tabellen und gespeicherte Prozeduren auswirken.DDL triggers do not fire in response to events that affect local or global temporary tables and stored procedures.

DDL-Trigger erstellen nicht die speziellen inserted - und deleted -Tabellen.DDL triggers do not create the special inserted and deleted tables.

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.The information about an event that fires a DDL trigger, and the subsequent changes caused by the trigger, is captured by using the EVENTDATA function.

Für jedes DDL-Ereignis sollen mehrere Trigger erstellt werden.Multiple triggers to be created for each DDL event.

Im Gegensatz zu DML-Triggern haben DDL-Trigger keinen Schemabereich.Unlike DML triggers, DDL triggers are not scoped to schemas. Aus diesem Grund können Funktionen wie OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY und OBJECTPROPERTYEX nicht verwendet werden, um Metadaten aus DDL-Triggern abzufragen.Therefore, functions such as OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY, and OBJECTPROPERTYEX cannot be used for querying metadata about DDL triggers. Verwenden Sie stattdessen die Katalogsichten.Use the catalog views instead.

DDL-Trigger im Gültigkeitsbereich des Servers werden im Objekt-Explorer von SQL Server Management Studio im Ordner Trigger angezeigt.Server-scoped DDL triggers appear in the SQL Server Management Studio Object Explorer in the Triggers folder. Dieser Ordner befindet sich unter dem Ordner Serverobjekte .This folder is located under the Server Objects folder. DDL-Trigger im Gültigkeitsbereich der Datenbanken werden im Ordner Datenbanktrigger angezeigt.Database-scoped DDL triggers appear in the Database Triggers folder. Dieser Ordner befindet sich unter dem Ordner Programmierbarkeit der entsprechenden Datenbank.This folder is located under the Programmability folder of the corresponding database.

Wichtig

Bösartiger Code innerhalb von Triggern kann unter ausgeweiteten Privilegien ausgeführt werden.Malicious code inside triggers can run under escalated privileges. Weitere Informationen dazu, wie Sie diese Bedrohung minimieren, finden Sie unter Verwalten der Triggersicherheit.For more information about how to help reduce this threat, see Manage Trigger Security.

DDL-Trigger-BereichDDL Trigger Scope

DDL-Trigger können als Antwort auf ein Transact-SQLTransact-SQL -Ereignis ausgelöst werden, das in der aktuellen Datenbank oder auf dem aktuellen Server verarbeitet wird.DDL triggers can fire in response to a Transact-SQLTransact-SQL event processed in the current database, or on the current server. Der Bereich des Triggers hängt von dem Ereignis ab.The scope of the trigger depends on the event. 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.For example, a DDL trigger created to fire in response to a CREATE_TABLE event can do so whenever a CREATE_TABLE event occurs in the database, or on the server instance. 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.A DDL trigger created to fire in response to a CREATE_LOGIN event can do so only when a CREATE_LOGIN event occurs in the server instance.

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.In the following example, DDL trigger safety will fire whenever a DROP_TABLE or ALTER_TABLE event occurs in the database.

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.In the following example, a DDL trigger prints a message if any CREATE_DATABASE event occurs on the current server instance. Für den Trigger wird beispielsweise die EVENTDATA -Funktion zum Abrufen des Texts der entsprechenden Transact-SQLTransact-SQL -Anweisung verwendet.The example uses the EVENTDATA function to retrieve the text of the corresponding Transact-SQLTransact-SQL statement. Weitere Informationen zum Verwenden von EVENTDATA mit DDL-Triggern finden Sie unter Verwenden der EVENTDATA-Funktion.For more information about how to use EVENTDATA with DDL triggers, see Use the EVENTDATA Function.

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-SQLTransact-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.The lists that map the Transact-SQLTransact-SQL statements to the scopes that can be specified for them are available through the links provided in the section "Selecting a Particular DDL Statement to Fire a DDL Trigger," later in this topic.

DDL-Trigger im Datenbankbereich werden als Objekte in der Datenbank gespeichert, in der sie erstellt werden.Database-scoped DDL triggers are stored as objects in the database in which they are created. DDL-Trigger können in der master -Datenbank erstellt werden und verhalten sich ebenso wie Trigger, die in benutzerdefinierten Datenbanken erstellt wurden.DDL triggers can be created in the master database and behave just like those created in user-designed databases. Informationen über DDL-Trigger erhalten Sie, indem Sie die sys.triggers -Katalogsicht abfragen.You can obtain information about DDL triggers by querying the sys.triggers catalog view. 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).You can query sys.triggers within the database context in which the triggers are created or by specifying the database name as an identifier, such as master.sys.triggers.

DDL-Trigger im Gültigkeitsbereich des Servers werden als Objekte in der master -Datenbank gespeichert.Server-scoped DDL triggers are stored as objects in the master database. Informationen zu DDL-Trigger im Gültigkeitsbereich des Servers erhalten Sie durch Abfragen der sys.server_triggers -Katalogsicht in jedem beliebigen Datenbankkontext.However, you can obtain information about server-scoped DDL triggers by querying the sys.server_triggers catalog view in any database context.

Angeben einer Transact-SQL-Anweisung oder Gruppe von AnweisungenSpecifying a Transact-SQL Statement or Group of Statements

Auswählen einer bestimmten DDL-Anweisung für das Auslösen eines DDL-TriggersSelecting a Particular DDL Statement to Fire a DDL Trigger

DDL-Trigger können so entworfen werden, dass ihre Auslösung nach der Ausführung einer oder mehrerer Transact-SQLTransact-SQL -Anweisungen erfolgt.DDL triggers can be designed to fire after one or more particular Transact-SQLTransact-SQL statements are run. Im vorherigen Beispiel wird der Trigger safety nach einem DROP_TABLE -Ereignis oder einem ALTER_TABLE -Ereignis ausgelöst.In the previous example, trigger safety fires after any DROP_TABLE or ALTER_TABLE event. Listen der Transact-SQLTransact-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.For lists of the Transact-SQLTransact-SQL statements that can be specified to fire a DDL trigger, and the scope at which the trigger can fire, see DDL Events.

Auswählen einer vordefinierten Gruppe von DDL-Anweisungen für das Auslösen eines DDL-TriggersSelecting a Predefined Group of DDL Statements to Fire a DDL Trigger

Ein DDL-Trigger kann nach der Ausführung eines beliebigen Transact-SQLTransact-SQL -Ereignisses ausgelöst werden, das zu einer vordefinierten Gruppe ähnlicher Ereignisse gehört.A DDL trigger can fire after execution of any Transact-SQLTransact-SQL event that belongs to a predefined grouping of similar events. 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.For example, if you want a DDL trigger to fire after any CREATE TABLE, ALTER TABLE, or DROP TABLE statement is run, you can specify FOR DDL_TABLE_EVENTS in the CREATE TRIGGER statement. Nachdem CREATE TRIGGER ausgeführt wurde, werden die von einer Ereignisgruppe abgedeckten Ereignisse der sys.trigger_events -Katalogsicht hinzugefügt.After CREATE TRIGGER is run, the events that are covered by an event group are added to the sys.trigger_events catalog view.

Wenn in SQL Server 2005 (9.x)SQL Server 2005 (9.x)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 2005 (9.x)SQL Server 2005 (9.x), if a trigger is created on an event group, sys.trigger_events does not include information about the event group, sys.trigger_events includes information only about the individual events covered by that group. In SQL Server 2008SQL Server 2008 und höher speichert sys.trigger_events Metadaten über die Ereignisgruppe dauerhaft, für die der Trigger erstellt wird, sowie über die einzelnen Ereignisse, die die Ereignisgruppe abdeckt.In SQL Server 2008SQL Server 2008 and higher, sys.trigger_events persists metadata about the event group on which the triggers is created, and also about the individual events that the event group covers. Daher gelten Änderungen der von diesen Ereignisgruppen in SQL Server 2008SQL Server 2008 und höher abgedeckten Ereignissen nicht für DDL-Trigger, die für diese Ereignisgruppen in SQL Server 2005 (9.x)SQL Server 2005 (9.x)erstellt werden.Therefore, changes to the events that are covered by event groups in SQL Server 2008SQL Server 2008 and higher do not apply to DDL triggers that are created on those event groups in SQL Server 2005 (9.x)SQL Server 2005 (9.x).

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 Event Groups.For a list of the predefined groups of DDL statements that are available for DDL triggers, the particular statements the event groups cover, and the scopes at which these event groups can be programmed, see DDL Event Groups.

TaskTask ThemaTopic
Beschreibt, wie DDL-Trigger erstellt, geändert, gelöscht oder deaktiviert werden.Describes how to create, modify, delete or disable DDL triggers. Implementieren von DDL-TriggernImplement DDL Triggers
Beschreibt, wie ein CLR-DDL-Trigger erstellt wird.Describes how to create a CLR DDL trigger. Erstellen von CLR-TriggernCreate CLR Triggers
Beschreibt, wie Informationen zu DDL-Triggern zurückgegeben werden.Describes how to return information about DDL triggers. Abrufen von Informationen zu DDL-TriggernGet Information About DDL Triggers
Beschreibt, wie Informationen zu einem Ereignis, das einen DDL-Trigger auslöst, mithilfe der EVENTDATA-Funktion zurückgegeben werden.Describes how to return information about an event that fires a DDL trigger by using the EVENTDATA function. Verwenden der EVENTDATA-FunktionUse the EVENTDATA Function
Beschreibt, wie Triggersicherheit verwaltet wird.Describes how to manage trigger security. Verwalten der TriggersicherheitManage Trigger Security

Weitere InformationenSee Also

DML-Trigger DML Triggers
Logon-Trigger Logon Triggers
CREATE TRIGGER (Transact-SQL)CREATE TRIGGER (Transact-SQL)