EVENTDATA (Transact-SQL)

 

DIESES THEMA GILT FÜR:jaSQL Server (ab 2008)jaAzure SQL-DatenbankneinAzure SQL Data Warehouse neinParallel Data Warehouse

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.

Topic link icon Transact-SQL-Syntaxkonventionen

  
EVENTDATA( )  

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.

System_CAPS_ICON_caution.jpg Achtung


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.

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

Alternativ können Sie das Ereignisschema an veröffentlicht wird die Microsoft SQL Server XML-Schemas Webseite.

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.

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

System_CAPS_ICON_note.jpg Hinweis


Bei einer Abfrage der <TSQLCommand> Element mit Ergebnisse in Raster in SQL Server Management Studio, Zeilenumbrüche im Befehlstext werden nicht angezeigt. Verwendung Ergebnisse in Text stattdessen.

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  

System_CAPS_ICON_note.jpg Hinweis


Wenn Sie Ereignisdaten zurückgeben möchten, wir empfehlen die Verwendung von XQuery value() -Methode anstelle der query() Methode. Die query() Methode zurückgibt XML und Ampersand-Escape Wagenrücklauf und Zeilenvorschub (CR/LF) Instanzen in der Ausgabe während der value() Methode rendert ein CR/LF-Instanzen in der Ausgabe nicht sichtbar.

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  

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

Community-Beiträge

HINZUFÜGEN
Anzeigen: