Dela via


EVENTDATA (Transact-SQL)

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Den här funktionen returnerar information om server- eller databashändelser. När ett händelsemeddelande utlöses och den angivna tjänstkoordinatorn tar emot resultatet EVENTDATA anropas. En DDL- eller inloggningsutlösare stöder också intern användning av EVENTDATA.

Transact-SQL syntaxkonventioner

Syntax

EVENTDATA( )

Anmärkningar

EVENTDATA returnerar endast data när de refereras direkt i en DDL- eller inloggningsutlösare. EVENTDATA returnerar null om andra rutiner anropar det, även om en DDL- eller inloggningsutlösare anropar dessa rutiner.

Data som returneras av EVENTDATA är ogiltiga efter en transaktion som

  • anropas EVENTDATA explicit
  • kallas EVENTDATA implicit
  • genomföranden
  • återställs

Försiktighet

EVENTDATA returnerar XML-data som skickas till klienten som Unicode som använder 2 byte för varje tecken. EVENTDATA returnerar XML som kan representera dessa Unicode-kodpunkter:

0x0009

0x000A

0x000D

>= 0x0020 && <= 0xD7FF

>= 0xE000 && <= 0xFFFD

XML kan inte uttrycka och tillåter inte vissa tecken som kan visas i Transact-SQL identifierare och data. Tecken eller data som har kodpunkter som inte visas i föregående lista mappas till ett frågetecken (?).

Lösenord visas inte när CREATE LOGIN eller ALTER LOGIN instruktioner körs. Detta skyddar inloggningssäkerheten.

Returnerade scheman

EVENTDATA returnerar ett värde av datatypen xml. Som standard installeras schemadefinitionen för alla händelser i den här katalogen: <enhet>:\Program Files\Microsoft SQL Server\nnn\Tools\Binn\schemas\sqlserver\2006\11\events\events.xsd.

Sidan Xml-scheman för Microsoft SQL Server har också händelseschemat.

Om du vill extrahera schemat för en viss händelse söker du i schemat efter Komplex typ EVENT_INSTANCE_<event_type>. Om du till exempel vill extrahera schemat för DROP_TABLE händelsen söker du i schemat efter EVENT_INSTANCE_DROP_TABLE.

Exempel

A. Köra frågor mot händelsedata i en DDL-utlösare

I det här exemplet skapas en DDL-utlösare som förhindrar att nya databastabeller skapas. Användning av XQuery mot XML-data som genereras av EVENTDATA samlar in den Transact-SQL-instruktion som utlöser utlösaren. Mer information finns i XQuery Language Reference (SQL Server).

Anmärkning

När du använder Results to Grid i SQL Server Management Studio för att fråga elementet <TSQLCommand> visas inte radbrytningar i kommandotexten. Använd Resultat till Text i stället.

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  

Anmärkning

Om du vill returnera händelsedata använder du metoden XQuery value() i stället för metoden query(). Metoden query() returnerar XML- och et-escape-instanser för vagnretur och radmatning (CR/LF) i utdata, medan metoden value() återger CR/LF-instanser osynliga i utdata.

B. Skapa en loggtabell med händelsedata i en DDL-utlösare

Det här exemplet skapar en tabell för informationslagring om alla händelser på databasnivå och fyller tabellen med en DDL-utlösare. Användning av XQuery mot XML-data som genereras av EVENTDATA samlar in händelsetypen och Transact-SQL-instruktionen.

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  

Se även

Använda funktionen EVENTDATA
DDL-utlösare
Händelsemeddelanden
inloggningsutlösare