EVENTDATA (Transact-SQL)

Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure

Questa funzione restituisce informazioni sugli eventi del server o del database. La funzione EVENTDATA viene chiamata quando viene generata una notifica degli eventi e il Service Broker specificato riceve i risultati. Anche un trigger DDL o LOGON supporta l'uso interno di EVENTDATA.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

EVENTDATA( )

Osservazioni:

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

I dati restituiti da EVENTDATA non sono validi dopo una transazione

  • che chiama EVENTDATA in modo esplicito
  • che chiama EVENTDATA in modo implicito
  • che esegue il commit
  • di cui viene eseguito il rollback

Attenzione

EVENTDATA restituisce dati XML, inviati al client in formato Unicode che usa 2 byte per ogni carattere. EVENTDATA restituisce codice XML che può rappresentare questi punti di codice Unicode:

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 (?).

Le password non vengono visualizzate quando si eseguono istruzioni CREATE LOGIN o ALTER LOGIN. Ciò consente di proteggere la sicurezza degli account di accesso.

Schemi restituiti

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

Lo schema di eventi è disponibile anche nella pagina Web Microsoft SQL Server XML Schemas (Schemi XML di Microsoft SQL Server).

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

Esempi

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

Questo esempio crea un trigger DDL che impedisce la creazione di nuove tabelle di database. L'uso di XQuery sui dati XML generati da EVENTDATA consente di acquisire l'istruzione Transact-SQL che attiva il trigger. Per altre informazioni, vedere Riferimento al linguaggio XQuery (SQL Server).

Nota

Quando si usa Risultati in formato griglia in SQL Server Management Studio per recuperare l'elemento <TSQLCommand>, le interruzioni di riga nel testo del comando non vengono visualizzate. Usare invece Risultati in formato testo.

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  

Nota

Per la restituzione dei dati evento, usare il metodo XQuery value() invece del metodo query(). Il metodo query() restituisce istanze XML e CR/LF (ritorno a capo/avanzamento riga) trasformate con il carattere di escape e commerciale (&) nell'output, 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

Questo esempio crea una tabella per l'archiviazione di informazioni su tutti gli eventi a livello di database e tale tabella viene popolata con un trigger DDL. L'uso di XQuery sui dati XML generai da EVENTDATA consente di acquisire il tipo di evento e l'istruzione Transact-SQL.

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  

Vedi anche

Usare la funzione EVENTDATA
Trigger DDL
Notifiche degli eventi
Trigger LOGON