Partilhar via


EVENTDATA (Transact-SQL)

Retorna informações sobre eventos do servidor ou do banco de dados. EVENTDATA é chamado quando uma notificação de eventos é acionada, e os resultados são retornados ao agente de serviço especificado. EVENTDATA também pode ser usado no corpo de um gatilho DDL ou de logon.

Ícone de vínculo de tópicoConvenções de sintaxe Transact-SQL

Sintaxe

EVENTDATA( )

Comentários

EVENTDATA só retorna dados quando referido diretamente dentro de um gatilho DDL ou de logon. EVENTDATA retorna nulo se for chamado por outras rotinas, mesmo se essas rotinas forem chamadas por um gatilho DDL ou de logon.

Os dados retornados por EVENTDATA não serão válidos depois que uma transação que chamou EVENTDATA, implícita ou explicitamente, for confirmada ou revertida.

Observação sobre cuidadosCuidado

EVENTDATA retorna dados XML. Esses dados são enviados ao cliente como Unicode, que usa 2 bytes para cada caractere. Os pontos de código Unicode a seguir podem ser representados no XML que é retornado por EVENTDATA:

0x0009

0x000A

0x000D

>= 0x0020 && <= 0xD7FF

>= 0xE000 && <= 0xFFFD

Alguns caracteres que podem se aparecer em identificadores Transact-SQL e dados não são exprimíveis ou permissíveis em XML. 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 (?).

Esquemas retornados

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

Como alternativa, o esquema do evento é publicado na página da Web Esquemas XML do Microsoft SQL Server.

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

O exemplo a seguir cria um gatilho DDL para impedir que novas tabelas sejam criadas no banco de dados. A instrução Transact-SQL que aciona o gatilho é capturada usando XQuery em relação aos dados XML gerados por EVENTDATA. Para obter mais informações, consulte Referência da linguagem XQuery (Mecanismo de Banco de Dados).

ObservaçãoObservação

Ao consultar o elemento <TSQLCommand> usando Resultados em Grade no SQL Server Management Studio, as quebras de linha no texto do comando não aparecerão. Em vez disso, use Resultados em Texto.

USE AdventureWorks2008R2;
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çãoObservação

Para retornar dados de evento, recomenda-se usar o método value() de 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

O exemplo a seguir cria uma tabela para armazenar informações sobre todos os eventos no nível do banco de dados e popula a tabela com um gatilho DDL. O tipo do evento e a instrução Transact-SQL são capturados usando XQuery em relação aos dados XML gerados por EVENTDATA.

USE AdventureWorks2008R2;
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

C. Validando uma instância de evento em relação a uma parte do esquema

O exemplo a seguir valida um evento DROP_TABLE em relação ao esquema retornado por EVENTDATA.

IF EXISTS (SELECT * FROM sys.xml_schema_collections WHERE name='EventsXML')
DROP XML SCHEMA COLLECTION EventsXML ;
GO

DECLARE @x xml
SET @x = (SELECT * FROM OPENROWSET(BULK 'c:\Program Files\Microsoft SQL Server\90\Tools\Binn\schemas\sqlserver\2006\11\events\events.xsd', single_clob) AS x)
CREATE XML SCHEMA COLLECTION EventsXML AS @x ;
GO

DECLARE @x xml(XSDEVENTS)
DECLARE @y xml
DECLARE @n nvarchar(max)

SELECT @y = EVENTDATA()
SELECT @n = @y
SELECT @n = REPLACE(@n, '<EVENT_INSTANCE', '<EVENT_INSTANCE xmlns=''https://schemas.microsoft.com/sqlserver/2006/eventdata'' xmlns:xsi=''http://www.w3.org/2001/XMLSchema-instance'' xsi:type=''EVENT_INSTANCE_DROP_TABLE''')

SELECT @x = @n -- This causes the validation.