Teilen über


DDL-Trigger

Gilt für:SQL ServerAzure SQL-DatenbankVerwaltete Azure SQL-InstanzSQL-Datenbank in Microsoft Fabric

DDL-Trigger lösen als Reaktion auf verschiedene Ereignisse der Data Definition Language (DDL) aus. Diese Ereignisse entsprechen in erster Linie Transact-SQL-Anweisungen, die mit den Schlüsselwörtern CREATE, ALTER, DROP, GRANT, DENY, REVOKE oder UPDATE STATISTICS beginnen. Bestimmte gespeicherte Systemprozeduren, die DDL-ähnliche Vorgänge ausführen, können ebenfalls DDL-Trigger auslösen.

Verwenden Sie DDL-Trigger, wenn Sie die folgenden Aufgaben ausführen möchten:

  • Verhindern bestimmter Änderungen am Datenbankschema
  • Als Antwort auf eine Änderung im Datenbankschema soll ein bestimmtes Ereignis auftreten.
  • Aufzeichnen von Änderungen oder Ereignissen im Datenbankschema

Wichtig

Testen Sie die DDL-Trigger, um ihre Reaktionen auf ausgeführte, gespeicherte Systemprozeduren zu ermitteln. Die CREATE TYPE Anweisung und die sp_addtype gespeicherte Prozedur lösen beispielsweise beide einen DDL-Trigger aus, der für ein CREATE_TYPE Ereignis erstellt wurde.

Typen von DDL-Triggern

Transact-SQL Auslöser

Eine spezielle Art von Transact-SQL Stored Procedure, die eine oder mehrere Transact-SQL-Anweisungen als Reaktion auf ein Ereignis mit Server- oder Datenbankbezug ausführt. Ein DDL-Trigger kann beispielsweise ausgelöst werden, wenn eine Anweisung wie ALTER SERVER CONFIGURATION ausgeführt wird oder eine Tabelle mithilfe von DROP TABLE gelöscht wird.

CLR-Trigger

Anstatt eine Transact-SQL gespeicherte Prozedur auszuführen, führt ein CLR-Trigger (Common Language Runtime) eine oder mehrere Methoden aus, die in verwaltetem Code geschrieben wurden, die Member einer Assembly sind, die in .NET Framework erstellt und in SQL Server hochgeladen wurde.

DDL-Trigger werden nur ausgelöst, nachdem die DDL-Anweisungen ausgeführt werden, die diese Trigger auslösen. DDL-Trigger können nicht als INSTEAD OF Trigger verwendet werden. DDL-Trigger werden nicht als Antwort auf Ereignisse ausgelöst, die sich auf lokale oder globale temporäre Tabellen und gespeicherte Prozeduren auswirken.

DDL-Trigger erstellen keine speziellen inserted Und deleted Tabellen.

Die Informationen zu einem Ereignis, das einen DDL-Trigger auslöst, und die nachfolgenden Änderungen, die durch den Trigger verursacht werden, werden mithilfe der EVENTDATA Funktion erfasst.

Für jedes DDL-Ereignis sollen mehrere Trigger erstellt werden.

Im Gegensatz zu DML-Triggern (Data Manipulation Language) sind DDL-Trigger nicht auf Schemas begrenzt. Daher können Funktionen wie OBJECT_ID, OBJECT_NAME, OBJECTPROPERTYund OBJECTPROPERTYEX nicht zum Abfragen von Metadaten zu DDL-Triggern verwendet werden. Verwenden Sie stattdessen die Katalogsichten.

DDL-Trigger im Gültigkeitsbereich des Servers werden im Objekt-Explorer von SQL Server Management Studio im Ordner Trigger angezeigt. Dieser Ordner befindet sich unter dem Ordner Serverobjekte . DDL-Trigger im Gültigkeitsbereich der Datenbanken werden im Ordner Datenbanktrigger angezeigt. Dieser Ordner befindet sich unter dem Ordner Programmierbarkeit der entsprechenden Datenbank.

Wichtig

Bösartiger Code innerhalb von Triggern kann unter ausgeweiteten Privilegien ausgeführt werden. Weitere Informationen dazu, wie Sie diese Bedrohung verringern können, finden Sie unter Verwalten der Triggersicherheit.

Bereich des DDL Triggers

DDL-Trigger können als Reaktion 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 Reaktion auf ein CREATE_TABLE Ereignis ausgelöst wird, kann dies beispielsweise tun, wenn ein CREATE_TABLE Ereignis in der Datenbank oder auf der Serverinstanz auftritt. Ein DDL-Trigger, der als Reaktion auf ein CREATE_LOGIN Ereignis ausgelöst wird, kann dies nur tun, wenn ein CREATE_LOGIN Ereignis in der Serverinstanz auftritt.

Im folgenden Beispiel wird der DDL-Trigger safety ausgelöst, wann immer ein Ereignis wie DROP_TABLE oder ALTER_TABLE 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. Das Beispiel verwendet die EVENTDATA-Funktion, um den Text der entsprechenden Transact-SQL-Anweisung abzurufen. Weitere Informationen zur Verwendung 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;

Die Listen, die die Transact-SQL Anweisungen den Bereichen zuordnen, die für sie angegeben werden können, sind über die links im Abschnitt "Auswählen einer bestimmten DDL-Anweisung" verfügbar, um einen DDL-Trigger später in diesem Artikel auszulösen.

DDL-Trigger werden in der Datenbank, in der sie erstellt werden, als Objekte gespeichert. DDL-Trigger können in der master Datenbank erstellt werden und sich genauso verhalten wie die in benutzerdefinierten Datenbanken erstellten. Sie können Informationen zu DDL-Triggern abrufen, indem Sie die sys.triggers Katalogansicht abfragen. Sie können sys.triggers innerhalb des Datenbankkontexts abfragen, in dem die Trigger erstellt werden, oder indem Sie den Datenbanknamen als Bezeichner angeben, z. B. master.sys.triggers.

DDL-Trigger mit Server-Gültigkeitsbereich werden als Objekte in der master-Datenbank gespeichert. Sie können jedoch Informationen zu DDL-Triggern mit Serverbereich abrufen, indem Sie die sys.server_triggers Katalogansicht in einem beliebigen Datenbankkontext abfragen.

Geben Sie eine Transact-SQL-Anweisung oder eine Gruppe von Anweisungen an

Wählen Sie eine bestimmte DDL-Anweisung aus, um einen DDL-Trigger auszulösen.

DDL-Trigger können so konzipiert werden, dass sie nach dem Ausführen einer oder mehrerer bestimmter Transact-SQL-Anweisungen ausgelöst werden. Im vorherigen Beispiel wird der Trigger safety nach einem DROP_TABLE -Ereignis oder einem ALTER_TABLE -Ereignis ausgelöst. Eine Liste der Transact-SQL-Anweisungen, die zum Auslösen eines DDL-Triggers angegeben werden können, und den Bereich, in dem der Trigger ausgelöst werden kann, finden Sie unter DDL-Ereignisse.

Wählen Sie eine vordefinierte Gruppe von DDL-Anweisungen aus, um einen DDL-Trigger auszulösen.

Ein DDL Trigger kann nach der Ausführung eines beliebigen Transact-SQL Ereignisses ausgelöst werden, das zu einer vordefinierten Gruppierung ähnlicher Ereignisse gehört. Wenn z. B. ein DDL-Trigger nach einer beliebigen CREATE TABLE, ALTER TABLEoder DROP TABLE Anweisung ausgelöst werden soll, können Sie in der FOR DDL_TABLE_EVENTS Anweisung angebenCREATE TRIGGER. Nachdem CREATE TRIGGER ausgeführt wurde, werden die Ereignisse, die von einer Ereignisgruppe abgedeckt werden, zur sys.trigger_events Katalogansicht hinzugefügt.

Wenn in SQL Server 2005 (9.x) ein Trigger für eine Ereignisgruppe erstellt wird, sys.trigger_events enthält keine Informationen zur Ereignisgruppe, während sys.trigger_events nur Informationen zu den einzelnen Ereignissen enthält, die von dieser Gruppe abgedeckt werden. sys.trigger_events Speichert Metadaten über die Ereignisgruppe, auf der der Trigger erstellt wird, und auch über die einzelnen Ereignisse, die die Ereignisgruppe abdeckt. Daher gelten Änderungen an den Ereignissen, die von Ereignisgruppen abgedeckt werden, nicht für DDL-Trigger in den letzten Versionen von SQL Server, die in diesen Ereignisgruppen in SQL Server 2005 (9.x) 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 Event Groups.

Aufgabe Artikel
Beschreibt, wie DDL-Trigger erstellt, geändert, gelöscht oder deaktiviert werden. Implementieren von DDL-Triggern
Beschreibt, wie ein CLR-DDL-Trigger erstellt wird. Erstellen von CLR-Triggern
Beschreibt, wie Informationen zu DDL-Triggern zurückgegeben werden. Abrufen von Informationen zu DDL-Triggern
Beschreibt, wie Mithilfe der EVENTDATA Funktion Informationen zu einem Ereignis zurückgegeben werden, das einen DDL-Trigger auslöst. Verwenden der EVENTDATA-Funktion
Beschreibt, wie Triggersicherheit verwaltet wird. Verwalten der Triggersicherheit