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 aufruftEVENTDATA
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