Verwenden der EVENTDATA-FunktionUse the EVENTDATA Function

GILT FÜR: jaSQL ServerjaAzure SQL-DatenbankneinAzure SQL Data Warehouse neinParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Informationen zu einem Ereignis, das einen DDL-Trigger auslöst, werden mit der EVENTDATA-Funktion erfasst.Information about an event that fires a DDL trigger is captured by using the EVENTDATA function. Diese Funktion gibt einen xml -Wert zurück.This function returns an xml value. Das XML-Schema schließt Informationen zu folgenden Punkten ein:The XML schema includes information about the following:

  • Zeitpunkt des Ereignisses.The time of the event.

  • Die SPID (System Process ID) der Verbindung, als der Trigger ausgeführt wurde.The System Process ID (SPID) of the connection when the trigger executed.

  • Der Typ des Ereignisses, die den Trigger ausgelöst haben.The type of event that fired the trigger.

Abhängig vom Ereignistyp schließt das Schema dann weitere Informationen ein, z. B. die Datenbank, in der das Ereignis aufgetreten ist, das Objekt, für das das Ereignis erfolgte, und die Transact-SQLTransact-SQL -Anweisung des Ereignisses.Depending on the event type, the schema then includes additional information such as the database in which the event occurred, the object against which the event occurred, and the Transact-SQLTransact-SQL statement of the event. Weitere Informationen finden Sie unter DDL Triggers.For more information, see DDL Triggers.

Der folgende DDL-Trigger wird z. B. in der AdventureWorks2012AdventureWorks2012 -Beispieldatenbank erstellt:For example, the following DDL trigger is created in the AdventureWorks2012AdventureWorks2012 sample database:

CREATE TRIGGER safety   
ON DATABASE   
FOR CREATE_TABLE   
AS   
    PRINT 'CREATE TABLE Issued.'  
    SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')  
   RAISERROR ('New tables cannot be created in this database.', 16, 1)   
   ROLLBACK  
;  

Anschließend wird die folgende CREATE TABLE -Anweisung ausgeführt:The following CREATE TABLE statement is then run:

CREATE TABLE NewTable (Column1 int);

Die EVENTDATA() -Anweisung im DDL-Trigger erfasst den Text der CREATE TABLE -Anweisung, die nicht zulässig ist.The EVENTDATA() statement in the DDL trigger captures the text of the CREATE TABLE statement that is not allowed. Dies erfolgt mithilfe einer XQuery-Anweisung für die von EVENTDATA generierten xml-Daten und durch Abrufen des <CommandText>-Elements.This is achieved by using an XQuery statement against the xml data that is generated by EVENTDATA and retrieving the <CommandText> element. Weitere Informationen finden Sie unter XQuery-Sprachreferenz (SQL Server).For more information, see XQuery Language Reference (SQL Server).

Achtung

EVENTDATA erfasst die Daten von CREATE_SCHEMA-Ereignissen sowie den <schema_element>-Text der entsprechenden CREATE SCHEMA-Definition, sofern vorhanden.EVENTDATA captures the data of CREATE_SCHEMA events as well as the <schema_element> of the corresponding CREATE SCHEMA definition, if any exists. Darüber hinaus erkennt EVENTDATA die <schema_element>-Definition als ein gesondertes Ereignis.Additionally, EVENTDATA recognizes the <schema_element> definition as a separate event. Deshalb ist es möglich, dass ein DDL-Trigger erstellt wurde, der für ein CREATE_SCHEMA-Ereignis sowie für ein Ereignis, das durch den <schema_element>-Text der CREATE SCHEMA-Definition dargestellt wird, möglicherweise dieselben Ereignisdaten doppelt zurückgibt, wie z. B. die TSQLCommand-Daten.Therefore, a DDL trigger created on both a CREATE_SCHEMA event, and an event represented by the <schema_element> of the CREATE SCHEMA definition, may return the same event data twice, such as the TSQLCommand data. Angenommen, ein DDL-Trigger wird für die Ereignisse CREATE_SCHEMA und CREATE_TABLE erstellt, und der folgende Batch wird ausgeführt:For example, consider a DDL trigger that is created on both the CREATE_SCHEMA and CREATE_TABLE events and the following batch is run:

CREATE SCHEMA s

CREATE TABLE t1 (col1 int)

Ruft die Anwendung die TSQLCommand -Daten des CREATE_TABLE-Ereignisses ab, sollten Sie beachten, dass diese Daten möglicherweise doppelt angezeigt werden: einmal, wenn das CREATE_SCHEMA-Ereignis stattfindet, und ein zweites Mal, wenn das CREATE_TABLE-Ereignis stattfindet.If the application retrieves the TSQLCommand data of the CREATE_TABLE event, be aware that this data may appear two times: once when the CREATE_SCHEMA event occurs, and again when the CREATE_TABLE event occurs. Vermeiden Sie das Erstellen von DDL-Triggern sowohl für die CREATE_SCHEMA-Ereignisse als auch für die <schema_element>-Texte entsprechender CREATE SCHEMA-Definitionen, oder integrieren Sie eine Logik in die Anwendung, damit dasselbe Ereignis nicht doppelt verarbeitet wird.Avoid creating DDL triggers on both the CREATE_SCHEMA events and the <schema_element> texts of any corresponding CREATE SCHEMA definitions, or build logic into your application so that the same event is not processed twice.

ALTER TABLE-Ereignis und ALTER DATABASE-EreignisALTER TABLE and ALTER DATABASE Events

Die Ereignisdaten für das ALTER_TABLE-Ereignis und das ALTER DATABASE-Ereignis umfassen auch die Namen und Typen anderer Objekte, die durch die DDL-Anweisung betroffen sind, sowie die Aktionen, die für diese Objekte ausgeführt werden.The event data for the ALTER_TABLE and ALTER_DATABASE events also includes the names and types of other objects affected by the DDL statement and the action performed on these objects. Die Daten für das ALTER_TABLE-Ereignis umfassen die Namen der Spalten, Einschränkungen oder Trigger, die durch die ALTER TABLE-Anweisung betroffen sind, sowie die Aktion (Erstellen, Ändern, Löschen, Aktivieren oder Deaktivieren), die für die betroffenen Objekte ausgeführt wurde.The ALTER_TABLE event data includes the names of the columns, constraints, or triggers affected by the ALTER TABLE statement and the action (create, alter, drop, enable, or disable) performed on the affected objects. Die Daten für das ALTER_DATABASE-Ereignis umfassen die Namen aller Dateien oder Dateigruppen, die durch die ALTER_DATABASE-Anweisung betroffen sind, sowie die Aktion (Erstellen, Ändern oder Löschen), die für die betroffenen Objekte ausgeführt wurde.The ALTER_DATABASE event data includes the names of any files or filegroups affected by the ALTER DATABASE statement and the action (create, alter, or drop) performed on the affected objects.

Der folgende DDL-Trigger wird beispielsweise in der AdventureWorks-Beispieldatenbank erstellt:For example, create the following DDL trigger in the AdventureWorks sample database:

CREATE TRIGGER ColumnChanges  
ON DATABASE   
FOR ALTER_TABLE  
AS  
-- Detect whether a column was created/altered/dropped.  
SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'nvarchar(max)')  
RAISERROR ('Table schema cannot be modified in this database.', 16, 1);  
ROLLBACK;  

Führen Sie dann die folgende ALTER TABLE-Anweisung aus, die gegen eine Einschränkung verstößt:Then execute the following ALTER TABLE statement that violates a constraint:

ALTER TABLE Person.Address ALTER COLUMN ModifiedDate date;   

Die EVENTDATA()-Anweisung im DDL-Trigger erfasst den Text der ALTER TABLE -Anweisung, der nicht zulässig ist.The EVENTDATA() statement in the DDL trigger captures the text of the ALTER TABLE statement that is not permitted.

BeispielExample

Mithilfe der EVENTDATA-Funktion können Sie ein Ereignisprotokoll erstellen.You can use the EVENTDATA function to create a log of events. Im folgenden Beispiel wird eine Tabelle zum Speichern von Ereignisinformationen erstellt.In the following example, a table is created to store event information. Anschließend wird ein DDL-Trigger für die aktuelle Datenbank erstellt, die bei jedem Auftreten eines DDL-Ereignisses auf Datenbankebene die Tabelle mit den folgenden Informationen auffüllt:A DDL trigger is then created on the current database that populates the table with the following information whenever any database-level DDL event occurs:

  • Zeitpunkt des Ereignisses (mithilfe der GETDATE-Funktion)The time of the event (using the GETDATE function).

  • Datenbankbenutzer, für dessen Sitzung das Ereignis aufgetreten ist (mithilfe der CURRENT_USER-Funktion)The database user against whose session the event occurred (using the CURRENT_USER function).

  • Typ des EreignissesThe type of the event.

  • Die Transact-SQLTransact-SQL -Anweisung, die das Ereignis enthalten hat.The Transact-SQLTransact-SQL statement that comprised the event.

Die beiden letzten Elemente werden wiederum erfasst, indem XQuery für die von EVENTDATA generierten xml -Daten verwendet wird.Again, the last two items are captured by using XQuery against the xml data that is generated by EVENTDATA.

USE AdventureWorks2012;  
GO  
CREATE TABLE ddl_log (PostTime datetime, DB_User nvarchar(100), Event nvarchar(100), TSQL nvarchar(2000));  
GO  
CREATE TRIGGER log   
ON DATABASE   
FOR DDL_DATABASE_LEVEL_EVENTS   
AS  
DECLARE @data XML  
SET @data = EVENTDATA()  
INSERT ddl_log   
   (PostTime, DB_User, Event, TSQL)   
   VALUES   
   (GETDATE(),   
   CONVERT(nvarchar(100), CURRENT_USER),   
   @data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'),   
   @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)') ) ;  
GO  
--Test the trigger  
CREATE TABLE TestTable (a int)  
DROP TABLE TestTable ;  
GO  
SELECT * FROM ddl_log ;  
GO  

Hinweis

Zum Zurückgeben von Ereignisdaten wird die Verwendung der XQuery value() -Methode anstelle der query() -Methode empfohlen.To return event data, we recommend that you use the XQuery value() method instead of the query() method. Bei der query() -Methode werden XML-Daten und durch das kaufmännische Und-Zeichen geschützte CR/LF-Instanzen (Wagenrücklauf/Zeilenvorschub) in der Ausgabe zurückgegeben, während bei der value() -Methode CR/LF-Instanzen zurückgegeben werden, die in der Ausgabe nicht sichtbar sind.The query() method returns XML and ampersand-escaped carriage return and line-feed (CRLF) instances in the output, while the value() method renders CRLF instances invisible in the output.

Ein ähnliches Beispiel für einen DDL-Trigger wird mit der AdventureWorks2012AdventureWorks2012 -Beispieldatenbank bereitgestellt.A similar DDL trigger example is provided with the AdventureWorks2012AdventureWorks2012 sample database. Auf das Beispiel können Sie mithilfe von SQL Server Management StudioSQL Server Management Studioim Ordner "Datenbanktrigger" zugreifen.To obtain the example, locate the Database Triggers folder by using SQL Server Management StudioSQL Server Management Studio. Dieser Ordner befindet sich unter dem Ordner Programmierbarkeit der AdventureWorks2012AdventureWorks2012 -Datenbank.This folder is located under the Programmability folder of the AdventureWorks2012AdventureWorks2012 database. Klicken Sie mit der rechten Maustaste auf ddlDatabaseTriggerLog, und wählen Sie Skript für Datenbanktrigger als aus.Right-click ddlDatabaseTriggerLog and select Script Database Trigger as. Standardmäßig ist der DDL-Trigger ddlDatabaseTriggerLog deaktiviert.By default, DDL trigger ddlDatabaseTriggerLog is disabled.

Weitere InformationenSee Also

DDL-Ereignisse DDL Events
DDL-EreignisgruppenDDL Event Groups