Compartilhar via


EVENTDATA (Transact-SQL)

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure

Essa função retorna informações sobre eventos do servidor ou do banco de dados. Quando uma notificação de evento é acionada e o agente de serviços especificado recebe os resultados, EVENTDATA é chamado. Um gatilho de logon ou DDL também dá suporte ao uso interno de EVENTDATA.

Convenções de sintaxe de Transact-SQL

Sintaxe

EVENTDATA( )

Comentários

EVENTDATA só retorna dados quando referenciado diretamente dentro de um gatilho DDL ou de logon. O EVENTDATA retorna null se outras rotinas o chamam, mesmo se um gatilho DDL ou logon chama essas rotinas.

Is dados retornados pelo EVENTDATA são inválidos após uma transação que

  • chamou EVENTDATA explicitamente
  • chamou EVENTDATA implicitamente
  • confirmações
  • é revertido

Cuidado

EVENTDATA retorna dados XML, enviados ao cliente como Unicode, que usam dois bytes para cada caractere. O EVENTDATA retorna o XML que pode representar esses pontos de código Unicode:

0x0009

0x000A

0x000D

>= 0x0020 && <= 0xD7FF

>= 0xE000 && <= 0xFFFD

O XML não pode expressar e não permitirá alguns caracteres que podem aparecer em identificadores Transact-SQL e dados. Os caracteres ou os dados que tenham pontos de código não mostrados na lista anterior serão mapeados para um ponto de interrogação (?).

As senhas não são exibidos quando as instruções CREATE LOGIN ou ALTER LOGIN são executadas. Isso protege a segurança de logon.

Esquemas retornados

EVENTDATA retorna um valor do tipo de dados xml. Por padrão, a definição de esquema de todos os eventos é instalada no seguinte diretório: C:\Program Files\Microsoft SQL Server\nnn\Tools\Binn\schemas\sqlserver\2006\11\events\events.xsd.

A página da Web Esquemas XML do Microsoft SQL Server também tem o esquema de eventos.

Para extrair o esquema de qualquer evento específico, pesquise o esquema pelo Tipo Complexo EVENT_INSTANCE_<event_type>. Por exemplo, para extrair o esquema do evento DROP_TABLE, pesquise o esquema por EVENT_INSTANCE_DROP_TABLE.

Exemplos

a. Consultando dados de evento em um gatilho DDL

Este exemplo cria um gatilho DDL que impede a criação de novas tabelas de banco de dados. O uso de XQuery em relação aos dados XML gerados por EVENTDATA captura a instrução Transact-SQL que aciona o gatilho. Confira Referência da linguagem XQuery (SQL Server) para obter mais informações.

Observação

Ao usar Resultados em Grade em SQL Server Management Studio para consultar o elemento <TSQLCommand>, quebras de linha no texto do comando não aparecem. Em vez disso, use Results to Text.

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  

Observação

Para retornar dados de evento, use o método value() do XQuery em vez do método query() . O método query() retorna instâncias XML e CR/LF (Retorno de Carro e Alimentação de Linha) com escape com E comercial na saída, enquanto o método value() renderiza instâncias CR/LF invisíveis na saída.

B. Criando uma tabela de log com dados de evento em um gatilho DDL

Este exemplo cria uma tabela para o armazenamento de informações sobre todos os eventos de nível de banco de dados e preenche a tabela com um gatilho DDL. O uso de XQuery em relação aos dados XML gerados por EVENTDATA captura o tipo de evento e a instrução 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  

Consulte Também

Usar a função EVENTDATA
Gatilhos DDL
Notificações de eventos
Gatilhos de logon