EVENTDATA (Transact-SQL)

Data aggiornamento: 12 dicembre 2006

Restituisce informazioni sugli eventi del server o del database. La funzione EVENTDATA viene chiamata quando viene attivato un trigger di notifica degli eventi e i risultati vengono restituiti al 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.

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.

ms173781.Caution(it-it,SQL.90).gifAttenzione:
EVENTDATA restituisce dati XML. I dati vengono inviati al client in formato Unicode, ovvero 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. Lo schema restituito per ogni evento è costituito dagli elementi nidificati all'interno di un elemento <EVENT_INSTANCE>. Per ottenere lo schema restituito per un evento, utilizzare l'indice o la funzione di ricerca per individuare l'argomento relativo all'evento nella documentazione in linea di SQL Server. I nomi di proprietà indicati per l'evento corrispondono a elementi restituiti nello schema, con le eccezioni seguenti:

  • EVENTDATA restituisce un elemento <ServerName> anziché <SQLInstance> e <ComputerName>.
  • EVENTDATA restituisce un elemento <EventType> aggiuntivo.

Ad esempio, l'evento ALTER_TABLE restituisce lo schema seguente:

<EVENT_INSTANCE>
    <EventType>type</EventType>
    <PostTime>date-time</PostTime>
    <SPID>spid</SPID>
    <ServerName>name</ServerName>
    <LoginName>name</LoginName>
    <UserName>name</UserName>
    <DatabaseName>name</DatabaseName>
    <SchemaName>name</SchemaName>
    <ObjectName>name</ObjectName>
    <ObjectType>type</ObjectType>
    <TSQLCommand>command</TSQLCommand>
</EVENT_INSTANCE>

Esempi

A. Recupero tramite query dei dati di evento 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 XQuery sul tipo di dati XML.

[!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] Per la restituzione di 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 i dati di evento in un trigger DDL

Nell'esempio seguente viene creata una tabella per l'archiviazione di informazioni su tutti gli eventi al livello del database e la 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

Vedere anche

Altre risorse

Utilizzo della funzione EVENTDATA
Progettazione di trigger DDL
Progettazione di notifiche degli eventi

Guida in linea e informazioni

Assistenza su SQL Server 2005

Cronologia modifiche

Versione Cronologia

12 dicembre 2006

Nuovo contenuto:
  • Aggiunta indicazione sulla possibilità di utilizzare la funzione EVENTDATA anche nel corpo di un trigger LOGON. I trigger LOGON sono stati introdotti in SQL Server Service Pack 2.