Delen via


EVENTDATA (Transact-SQL)

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Deze functie retourneert informatie over server- of database-gebeurtenissen. Wanneer een gebeurtenismelding wordt geactiveerd en de opgegeven servicebroker de resultaten ontvangt, EVENTDATA wordt aangeroepen. Een DDL- of aanmeldingstrigger ondersteunt ook intern gebruik van EVENTDATA.

Transact-SQL syntaxis-conventies

Syntaxis

EVENTDATA( )

Opmerkingen

EVENTDATA retourneert alleen gegevens wanneer er rechtstreeks naar een DDL- of aanmeldingstrigger wordt verwezen. EVENTDATA retourneert null als andere routines deze aanroepen, zelfs als een DDL- of aanmeldingstrigger deze routines aanroept.

Gegevens die worden geretourneerd door EVENTDATA , zijn ongeldig na een transactie die

  • expliciet aangeroepen EVENTDATA
  • impliciet aangeroepen EVENTDATA
  • doorvoeringen
  • wordt teruggedraaid

Waarschuwing

EVENTDATA retourneert XML-gegevens, verzonden naar de client als Unicode die voor elk teken 2 bytes gebruikt. EVENTDATA retourneert XML die deze Unicode-codepunten kan vertegenwoordigen:

0x0009

0x000A

0x000D

>= 0x0020 && <= 0xD7FF

>= 0xE000 && <= 0xFFFD

XML kan niet worden weergegeven en staat bepaalde tekens niet toe die kunnen worden weergegeven in Transact-SQL id's en gegevens. Tekens of gegevens met codepunten die niet in de vorige lijst worden weergegeven, worden toegewezen aan een vraagteken (?).

Wachtwoorden worden niet weergegeven wanneer CREATE LOGIN of ALTER LOGIN instructies worden uitgevoerd. Dit beschermt de aanmeldingsbeveiliging.

Geretourneerde schema's

EVENTDATA retourneert een waarde van het gegevenstype XML. Standaard wordt de schemadefinitie voor alle gebeurtenissen geïnstalleerd in deze map: <station>:\Program Files\Microsoft SQL Server\nnn\Tools\Binn\schemas\sqlserver\2006\11\events\events.xsd.

De webpagina XML-schema's van Microsoft SQL Server bevat ook het gebeurtenisschema.

Als u het schema voor een bepaalde gebeurtenis wilt extraheren, zoekt u in het schema naar het complexe type EVENT_INSTANCE_<event_type>. Als u bijvoorbeeld het schema voor de DROP_TABLE gebeurtenis wilt extraheren, zoekt u in het schema naar EVENT_INSTANCE_DROP_TABLE.

Voorbeelden

Eén. Query's uitvoeren op gebeurtenisgegevens in een DDL-trigger

In dit voorbeeld wordt een DDL-trigger gemaakt die het maken van nieuwe databasetabellen voorkomt. Gebruik van XQuery op basis van de XML-gegevens die worden gegenereerd door EVENTDATA het vastleggen van de Transact-SQL instructie waarmee de trigger wordt geactiveerd. Zie XQuery Language Reference (SQL Server) voor meer informatie.

Opmerking

Wanneer u resultaten gebruikt in Grid in SQL Server Management Studio om een query uit te voeren op het <TSQLCommand> element, worden regeleinden in de opdrachttekst niet weergegeven. Gebruik in plaats daarvan resultaten voor tekst .

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  

Opmerking

Als u gebeurtenisgegevens wilt retourneren, gebruikt u de methode XQuery value() in plaats van de query() -methode. De methode query() retourneert XML- en ampersand-escaped regelterugloop- en regelinvoerexemplaren (CR/LF) in de uitvoer, terwijl de methode value() CR/LF-exemplaren onzichtbaar maakt in de uitvoer.

B. Een logboektabel maken met gebeurtenisgegevens in een DDL-trigger

In dit voorbeeld wordt een tabel gemaakt voor informatieopslag over alle gebeurtenissen op databaseniveau en wordt die tabel gevuld met een DDL-trigger. Het gebruik van XQuery op basis van de XML-gegevens die worden gegenereerd door EVENTDATA het gebeurtenistype en de Transact-SQL-instructie vast te leggen.

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  

Zie ook

De functie EVENTDATA gebruiken
DDL-triggers
Gebeurtenismeldingen
Aanmeldingstriggers