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