EVENTDATA (Transact-SQL)

Restituisce informazioni sugli eventi del server o del database. La funzione EVENTDATA viene chiamata quando viene generata una notifica degli eventi e i risultati vengono restituiti al servizio Service Broker specificato. È possibile utilizzare EVENTDATA anche nel corpo di un trigger DDL o LOGON.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

EVENTDATA( )

Osservazioni

EVENTDATA restituisce dati solo se utilizzata direttamente in un trigger DDL o LOGON. EVENTDATA restituisce Null se viene chiamata da altre routine, anche se tali routine sono chiamate da un trigger DDL o LOGON.

I dati restituiti da EVENTDATA non sono validi dopo il commit o il rollback di una transazione che ha chiamato EVENTDATA, in modo implicito o esplicito.

Nota di attenzioneAttenzione

EVENTDATA restituisce dati XML. Tali dati vengono inviati al client in formato Unicode, utilizzando 2 byte per ogni carattere. I punti di codice Unicode seguenti possono essere rappresentati nel codice XML restituito da EVENTDATA:

0x0009

0x000A

0x000D

>= 0x0020 && <= 0xD7FF

>= 0xE000 && <= 0xFFFD

Alcuni caratteri che possono essere inclusi in identificatori e dati Transact-SQL non sono rappresentabili o consentiti in XML. I caratteri o i dati con punti di codice non indicati nell'elenco precedente vengono mappati a un punto interrogativo (?).

Schemi restituiti

EVENTDATA restituisce un valore di tipo xml. Per impostazione predefinita, la definizione dello schema per tutti gli eventi è installata nella directory seguente: C:\Programmi\Microsoft SQL Server\100\Tools\Binn\schemas\sqlserver\2006\11\events\events.xsd.

In alternativa, lo schema degli eventi è pubblicato nella pagina Web Microsoft SQL Server XML Schemas.

Per estrarre lo schema di un evento specifico, cercare nello schema il tipo complesso EVENT_INSTANCE_<event_type>. Ad esempio, per estrarre lo schema di un evento DROP_TABLE, cercare nello schema EVENT_INSTANCE_DROP_TABLE.

Esempi

A. Recupero tramite query dei dati di eventi in un trigger DDL

Nell'esempio seguente viene creato un trigger DDL per impedire la creazione di nuove tabelle nel database. L'istruzione Transact-SQL che attiva il trigger viene acquisita utilizzando XQuery sui dati XML generati da EVENTDATA. Per ulteriori informazioni, vedere Riferimento al linguaggio di XQuery (motore di database).

[!NOTA]

Quando si esegue una query sull'elemento <TSQLCommand> tramite Risultati in formato griglia in SQL Server Management Studio, le interruzioni di riga nel testo del comando non vengono visualizzate. Utilizzare invece Risultati in formato testo.

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

[!NOTA]

Se si desidera restituire dati sugli eventi, è consigliabile utilizzare il metodo XQuery value() anziché il metodo query(). Il metodo query() restituisce output XML con le istanze CR/LF (ritorno a capo/avanzamento riga) trasformate con il carattere di escape e commerciale (&amp;), mentre il metodo value() rende le istanze CR/LF invisibili nell'output.

B. Creazione di una tabella di log con dati di eventi in un trigger DDL

Nell'esempio seguente viene creata una tabella per l'archiviazione di informazioni su tutti gli eventi a livello di database e tale tabella viene popolata con un trigger DDL. Il tipo di evento e l'istruzione Transact-SQL vengono acquisiti utilizzando XQuery sui dati XML generati da EVENTDATA.

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

C. Convalida di un'istanza dell'evento in base a parte dello schema

Nell'esempio seguente viene convalidato un evento DROP_TABLE in base allo schema restituito da EVENTDATA.

IF EXISTS (SELECT * FROM sys.xml_schema_collections WHERE name='EventsXML')
DROP XML SCHEMA COLLECTION EventsXML ;
GO

DECLARE @x xml
SET @x = (SELECT * FROM OPENROWSET(BULK 'c:\Program Files\Microsoft SQL Server\90\Tools\Binn\schemas\sqlserver\2006\11\events\events.xsd', single_clob) AS x)
CREATE XML SCHEMA COLLECTION EventsXML AS @x ;
GO

DECLARE @x xml(XSDEVENTS)
DECLARE @y xml
DECLARE @n nvarchar(max)

SELECT @y = EVENTDATA()
SELECT @n = @y
SELECT @n = REPLACE(@n, '<EVENT_INSTANCE', '<EVENT_INSTANCE xmlns=''https://schemas.microsoft.com/sqlserver/2006/eventdata'' xmlns:xsi=''http://www.w3.org/2001/XMLSchema-instance'' xsi:type=''EVENT_INSTANCE_DROP_TABLE''')

SELECT @x = @n -- This causes the validation.