EVENTDATA (Transact-SQL)

Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance

Esta función devuelve información acerca de los eventos de base de datos o servidor. EVENTDATA se llama cuando se activa una notificación de eventos y el resultado se devuelve al Service Broker especificado. Un desencadenador DDL o LOGON también admite el uso interno de EVENTDATA.

Convenciones de sintaxis de Transact-SQL

Sintaxis

EVENTDATA( )

Comentarios

EVENTDATA devuelve datos solo cuando se hace referencia al mismo directamente dentro de un desencadenador DDL o LOGON. EVENTDATA devuelve NULL si otras rutinas lo llaman, incluso si un desencadenador DDL o LOGON llama a esas rutinas.

Los datos que EVENTDATA devuelve no son válidos después de una transacción que

  • llamó a EVENTDATA de manera explícita
  • llamó a EVENTDATA de manera implícita
  • se confirma
  • se revierte

Precaución

EVENTDATA devuelve datos de XML, enviados al cliente como Unicode que usa 2 bytes para cada carácter. EVENTDATA devuelve XML que puede representar estos puntos de código de Unicode:

0x0009

0x000A

0x000D

>= 0x0020 && <= 0xD7FF

>= 0xE000 && <= 0xFFFD

XML no puede expresar, ni permitirá, algunos caracteres que pueden aparecer en los datos e identificadores de Transact-SQL. Los caracteres o datos que tienen puntos de código que no se muestran en la lista anterior se asignan a un signo de interrogación (?).

Las contraseñas no se muestran cuando se ejecutan las instrucciones CREATE LOGIN o ALTER LOGIN. Esto protege la seguridad del inicio de sesión.

Esquemas devueltos

EVENTDATA devuelve un valor de tipo de datos xml. De manera predeterminada, la definición de esquema para todos los eventos se instala en este directorio: C:\Program Files\Microsoft SQL Server\nnnTools\Binn\schemas\sqlserver\2006\11\events\events.xsd.

La página web Esquemas XML de Microsoft SQL Server también tiene el esquema de eventos.

Para extraer el esquema de un evento concreto, busque el esquema del tipo complejo EVENT_INSTANCE_<event_type>. Por ejemplo, para extraer el esquema del evento DROP_TABLE, busque el esquema de EVENT_INSTANCE_DROP_TABLE.

Ejemplos

A. Consultar datos de evento en un desencadenador DDL

En este ejemplo se crea un desencadenador DDL que impide la creación de nuevas tablas de bases de datos. El uso de XQuery con los datos XML generados por EVENTDATA captura la instrucción Transact-SQL que activa el desencadenador. Consulte Referencia del lenguaje XQuery (SQL Server) para más información.

Nota

Cuando se usa Resultados a cuadrícula en SQL Server Management Studio para consultar el elemento <TSQLCommand>, no se muestran los saltos de línea en el texto del comando. Es preferible usar Resultados a texto.

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

Para devolver datos de evento, use el método XQuery value() en lugar del método query(). El método query() devuelve XML e instancias de retorno de carro y avance de línea (CR/LF) con el carácter de escape “y” comercial en el resultado, mientras que el método value() representa instancias de CR/LF invisibles en el resultado.

B. Crear una tabla de registro con datos de evento en un desencadenador DDL

En este ejemplo se crea una tabla para almacenar información sobre todos los eventos de nivel de base de datos y rellena esa tabla con un desencadenador DDL. El uso de XQuery con los datos XML generados por EVENTDATA captura el tipo de evento y la instrucción 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 también

Usar la función EVENTDATA
Desencadenadores DDL
Notificaciones de eventos
Desencadenadores logon