EVENTDATA (Transact-SQL)

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance

Diese Funktion gibt Informationen zu Server- oder Datenbankereignissen zurück. Beim Auslösen einer Ereignisbenachrichtigung und, wenn der angegebene Service Broker die Ergebnisse empfängt, wird EVENTDATA aufgerufen. Ein DDL- oder LOGON-Trigger unterstützt auch die interne Verwendung von EVENTDATA.

Transact-SQL-Syntaxkonventionen

Syntax

EVENTDATA( )

Hinweise

EVENTDATA gibt nur Daten zurück, wenn ein direkter Verweis innerhalb eines DDL- oder LOGON-Triggers vorliegt. EVENTDATA gibt beim Aufruf durch andere Routinen NULL zurück, selbst wenn diese Routinen durch einen DDL- oder LOGON-Trigger aufgerufen werden.

Von EVENTDATA zurückgegebene Daten sind ungültig, nachdem eine Transaktion

  • EVENTDATA explizit aufruft
  • EVENTDATA implizit aufruft
  • einen Commit ausführt
  • durch ein Rollback rückgängig gemacht wurde

Achtung

EVENTDATA gibt XML-Daten zurück, die als Unicode an den Client gesendet werden; dabei werden 2 Bytes für jedes Zeichen verwendet. EVENTDATA gibt XML-Daten zurück, die diese Unicode-Codeendpunkte darstellen können:

0x0009

0x000A

0x000D

>= 0x0020 && <= 0xD7FF

>= 0xE000 && <= 0xFFFD

In XML können einige Zeichen, die in Transact-SQL-Bezeichnern und -Daten vorkommen können, nicht ausgedrückt werden und sind unzulässig. Zeichen oder Daten mit Codeelementen, die in der vorhergehenden Liste nicht enthalten sind, weisen ein Fragezeichen auf (?).

Kennwörter werden nicht angezeigt, wenn CREATE LOGIN- oder ALTER LOGIN-Anweisungen ausgeführt werden. Dies dient dem Schutz der Anmeldeinformationen.

Zurückgegebene Schemas

EVENTDATA gibt einen Wert vom Datentyp xml zurück. Standardmäßig wird die Schemadefinition für alle Ereignisse in diesem Verzeichnis installiert: C:\Programme\Microsoft SQL Server\nnn\Tools\Binn\schemas\sqlserver\2006\11\events\events.xsd.

Auf der Webseite Microsoft SQL Server: XML-Schemas ist ebenfalls das Ereignisschema veröffentlicht.

Um das Schema für ein besonderes Ereignis zu extrahieren, durchsuchen Sie das Schema nach dem komplexen Typ EVENT_INSTANCE_<event_type>. Zum Beispiel können Sie das Schema für das DROP_TABLE-Ereignis extrahieren, indem Sie das Schema nach EVENT_INSTANCE_DROP_TABLE durchsuchen.

Beispiele

A. Abfragen von Ereignisdaten in einem DDL-Trigger

In diesem Beispiel wird ein DDL-Trigger erstellt, der die Erstellung neuer Datenbanktabellen verhindert. Durch die Verwendung von XQuery für die von EVENTDATA generierten XML-Daten wird die Transact-SQL-Anweisung erfasst, die den Trigger auslöst. Weitere Informationen finden Sie unter XQuery-Sprachreferenz (SQL Server).

Hinweis

Wenn Sie mithilfe von Ergebnisse in Raster in SQL Server Management Studio das <TSQLCommand>-Element abfragen, werden keine Zeilenumbrüche im Befehlstext angezeigt. Verwenden Sie stattdessen Ergebnisse in Text.

USE AdventureWorks2022;  
GO  
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  
;  
GO  
--Test the trigger.  
CREATE TABLE NewTable (Column1 INT);  
GO  
--Drop the trigger.  
DROP TRIGGER safety  
ON DATABASE;  
GO  

Hinweis

Zum Zurückgeben von Ereignisdaten verwenden Sie die XQuery-Methode value() anstelle der Methode query(). Bei der query()-Methode werden XML-Daten und durch das kaufmännische Und-Zeichen geschützte CR/LF-Instanzen in der Ausgabe zurückgegeben, während bei der value()-Methode CR/LF-Instanzen zurückgegeben werden, die in der Ausgabe nicht sichtbar sind.

B. Erstellen einer Protokolltabelle mit Ereignisdaten in einem DDL-Trigger

In diesem Beispiel wird eine Tabelle zum Speichern von Informationen zu Ereignissen auf allen Datenbankebenen erstellt und die Tabelle mit einem DDL-Trigger aufgefüllt. Durch die Verwendung von XQuery für die von EVENTDATA generierten XML-Daten werden der Ereignistyp und die Transact-SQL-Anweisung erfasst.

USE AdventureWorks2022;  
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  
--Drop the trigger.  
DROP TRIGGER log  
ON DATABASE;  
GO  
--Drop table ddl_log.  
DROP TABLE ddl_log;  
GO  

Weitere Informationen

Verwenden der EVENTDATA-Funktion
DDL-Trigger
Ereignisbenachrichtigungen
Logon-Trigger