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.

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.

VorsichtshinweisVorsicht

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 (?).

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\100\ 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 (Datenbankmodul).

HinweisHinweis

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 AdventureWorks2008R2;
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
HinweisHinweis

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 AdventureWorks2008R2;
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

C. Überprüfen einer Ereignisinstanz in Bezug auf einen Teil des Schemas

Im folgenden Beispiel wird ein DROP_TABLE-Ereignis in Bezug auf das von EVENTDATA zurückgegebene Schema überprüft.

IF EXISTS (SELECT * FROM sys.xml_schema_collections WHERE name='EventsXML')
DROP XML SCHEMA COLLECTION EventsXML ;
GO

DECLARE @x xml
SET @x = (SELECT * FROM OPENROWSET(BULK 'c:\Program Files\Microsoft SQL Server\90\Tools\Binn\schemas\sqlserver\2006\11\events\events.xsd', single_clob) AS x)
CREATE XML SCHEMA COLLECTION EventsXML AS @x ;
GO

DECLARE @x xml(XSDEVENTS)
DECLARE @y xml
DECLARE @n nvarchar(max)

SELECT @y = EVENTDATA()
SELECT @n = @y
SELECT @n = REPLACE(@n, '<EVENT_INSTANCE', '<EVENT_INSTANCE xmlns=''https://schemas.microsoft.com/sqlserver/2006/eventdata'' xmlns:xsi=''http://www.w3.org/2001/XMLSchema-instance'' xsi:type=''EVENT_INSTANCE_DROP_TABLE''')

SELECT @x = @n -- This causes the validation.