EVENTDATA (Transact-SQL)

Aktualisiert: 12. Dezember 2006

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 Textes 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 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.

ms173781.Caution(de-de,SQL.90).gifVorsicht:
EVENTDATA gibt XML-Daten zurück. Diese Daten werden als Unicode an den Client gesendet; dabei werden 2 Byte 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. Das für jedes Ereignis zurückgegebene Schema besteht aus Elementen, die in einem <EVENT_INSTANCE>-Element geschachtelt sind. Das für ein Ereignis zurückgegebene Schema erhalten Sie, indem Sie mithilfe von Index oder Suche nach dem Thema für das Ereignis in der SQL Server-Onlinedokumentation suchen. Die für das Ereignis aufgelisteten Eigenschaftsnamen entsprechen Elementen, die im Schema zurückgegeben werden. Dabei gelten die folgenden Ausnahmen:

  • EVENTDATA gibt ein <ServerName>-Element anstatt <SQLInstance> und <ComputerName> zurück.
  • EVENTDATA gibt ein zusätzliches <EventType>-Element zurück.

So gibt beispielsweise das ALTER_TABLE-Ereignis das folgende Schema zurück:

<EVENT_INSTANCE>
    <EventType>type</EventType>
    <PostTime>date-time</PostTime>
    <SPID>spid</SPID>
    <ServerName>name</ServerName>
    <LoginName>name</LoginName>
    <UserName>name</UserName>
    <DatabaseName>name</DatabaseName>
    <SchemaName>name</SchemaName>
    <ObjectName>name</ObjectName>
    <ObjectType>type</ObjectType>
    <TSQLCommand>command</TSQLCommand>
</EVENT_INSTANCE>

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 für den xml-Datentyp.

ms173781.note(de-de,SQL.90).gifHinweis:
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 anstelle dessen Ergebnisse in Text.
USE AdventureWorks;
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
ms173781.note(de-de,SQL.90).gifHinweis:
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 AdventureWorks;
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

Andere Ressourcen

Verwenden der EVENTDATA-Funktion
Entwerfen von DDL-Triggern
Entwerfen von Ereignisbenachrichtigungen

Hilfe und Informationen

Informationsquellen für SQL Server 2005

Änderungsverlauf

Version Verlauf

12. Dezember 2006

Neuer Inhalt:
  • Es wurde hinzugefügt, dass EVENTDATA auch innerhalb des Textes eines LOGON-Triggers verwendet werden kann. LOGON-Trigger werden in SQL Server Service Pack 2 eingeführt.