Freigeben über


EVENTDATA (Transact-SQL)

Gibt Informationen zu Server- oder Datenbankereignissen zurück. EVENTDATA wird beim Auslösen einer Ereignisbenachrichtigung aufgerufen, und die Ergebnisse werden an den angegebenen Service Broker zurückgegeben. EVENTDATA kann auch innerhalb des Texts eines DDL- oder LOGON-Triggers verwendet werden.

Gilt für: SQL Server (SQL Server 2008 bis aktuelle Version), Windows Azure SQL-Datenbank (Ursprüngliche Version bis aktuelle Version).

Themenlink (Symbol) Transact-SQL-Syntaxkonventionen

Syntax

EVENTDATA( )

Hinweise

EVENTDATA gibt nur Daten zurück, wenn ein direkter Verweis innerhalb eines DDL- oder LOGON-Triggers vorliegt. Wenn EVENTDATA von anderen Routinen aufgerufen wird, wird auch dann NULL zurückgegeben, wenn diese Routinen von einem DDL- oder LOGON-Trigger aufgerufen wurden.

Von EVENTDATA zurückgegebene Daten sind nicht gültig, nachdem für eine Transaktion, die EVENTDATA implizit oder explizit aufgerufen hat, ein Commit oder ein Rollback ausgeführt wurde.

Warnung

EVENTDATA gibt XML-Daten zurück.Diese Daten werden als Unicode an den Client gesendet; dabei werden 2 Bytes für jedes Zeichen verwendet.Die folgenden Unicode-Codeelemente können in den von EVENTDATA zurückgegebenen XML-Daten dargestellt werden:

0x0009

0x000A

0x000D

>= 0x0020 && <= 0xD7FF

>= 0xE000 && <= 0xFFFD

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

Zum Schutz der Anmeldedaten werden beim Ausführen einer CREATE LOGIN-Anweisung oder ALTER LOGIN-Anweisung keine Kennwörter angezeigt.

Zurückgegebene Schemas

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

Alternativ wird das Ereignisschema auf der Webseite Microsoft SQL Server XML-Schemas veröffentlicht.

Um das Schema für ein besonderes Ereignis zu extrahieren, durchsuchen Sie das Schema nach dem komplexen Typ EVENT_INSTANCE_<event_type>. Um beispielsweise das Schema für das DROP_TABLE-Ereignis zu extrahieren, durchsuchen Sie das Schema nach EVENT_INSTANCE_DROP_TABLE.

Beispiele

A.Abfragen von Ereignisdaten in einem DDL-Trigger

Im folgenden Beispiel wird ein DDL-Trigger erstellt, der verhindern soll, dass neue Tabellen in der Datenbank erstellt werden. Die Transact-SQL-Anweisung, die den Trigger auslöst, wird durch Verwenden eines XQuery-Ausdrucks für die von EVENTDATA generierten XML-Daten erfasst. Weitere Informationen finden Sie unter XQuery-Sprachreferenz (SQL Server).

Hinweis

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

USE AdventureWorks2012;
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

Wenn Sie Ereignisdaten zurückgeben möchten, wird die Verwendung der XQuery value()-Methode anstelle der query()-Methode empfohlen.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.

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

Im folgenden Beispiel wird eine Tabelle zum Speichern von Informationen zu Ereignissen auf allen Datenbankebenen erstellt und die Tabelle mit einem DDL-Trigger aufgefüllt. Der Ereignistyp und die Transact-SQL-Anweisung werden mithilfe eines XQuery-Ausdrucks für alle von EVENTDATA generierten XML-Daten erfasst.

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

Siehe auch

Konzepte

Verwenden der EVENTDATA-Funktion

DDL-Trigger

Ereignisbenachrichtigungen

Logon-Trigger