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