Share via


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 argomento Convenzioni 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. Gli elementi 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. Sui caratteri o i dati con elementi di codice non indicati nell'elenco precedente viene eseguito il mapping a un punto interrogativo (?).

Per proteggere la sicurezza degli account di accesso, quando vengono eseguite le istruzioni CREATE LOGIN o ALTER LOGIN, le password non vengono visualizzate.

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\110\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 XQuery (SQL Server).

[!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 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

[!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 (&), 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 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

Vedere anche

Concetti

Utilizzo della funzione EVENTDATA

Trigger DDL

Notifiche degli eventi

Trigger LOGON