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.
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.
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.
Attenzione: |
---|
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
Cronologia modifiche
Versione | Cronologia |
---|---|
12 dicembre 2006 |
|