EVENTDATA (Transact-SQL)

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. EVENTDATA también se puede utilizar dentro del cuerpo de un desencadenador DDL o logon.

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

Sintaxis

EVENTDATA( )

Comentarios

EVENTDATA devuelve datos sólo cuando se hace referencia al mismo directamente dentro de un desencadenador DDL o logon. EVENTDATA devuelve NULL si se llama desde otras rutinas, aunque un desencadenador DDL o logon llame a esas rutinas.

Los datos devueltos por EVENTDATA no son válidos después de confirmar o revertir una transacción que ha llamado a EVENTDATA, de forma implícita o explícita.

Nota de advertenciaAdvertencia

EVENTDATA devuelve datos XML. Estos datos se envían al cliente como Unicode que utiliza 2 bytes para cada carácter. Los siguientes puntos de código Unicode se pueden representar en XML que devuelve EVENTDATA:

0x0009

0x000A

0x000D

>= 0x0020 && <= 0xD7FF

>= 0xE000 && <= 0xFFFD

Algunos caracteres que pueden aparecer en identificadores y datos de Transact-SQL no se pueden expresar o permitir en XML. 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 (?).

Esquemas devueltos

EVENTDATA devuelve un valor de tipo xml. De forma predeterminada, la definición de esquema para todos los eventos se instala en el directorio siguiente: C:\Archivos de programa\Microsoft SQL Server\100\Tools\Binn\schemas\sqlserver\2006\11\events\events.xsd.

O bien, el esquema de evento se publica en la página web Microsoft SQL Server XML Schemas (en inglés).

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 el siguiente ejemplo se crea un desencadenador DDL para impedir que se creen tablas nuevas en la base de datos. La instrucción Transact-SQL que activa el desencadenador se captura con XQuery con los datos XML que genera EVENTDATA. Para obtener más información, vea Referencia de lenguaje XQuery (motor de base de datos).

Nota

Cuando se consulta el elemento <TSQLCommand> con Resultados a cuadrícula en SQL Server Management Studio, no aparecen los saltos de línea en el texto del comando. En su lugar, use Resultados a 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

Nota

Cuando desee devolver datos de evento, se recomienda utilizar el método XQuery value() en vez 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 el siguiente ejemplo se crea una tabla para almacenar información sobre todos los eventos de nivel de base de datos y se rellena con un desencadenador DDL. El tipo de evento y la instrucción Transact-SQL se capturan mediante XQuery con los datos XML generados 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. Validar una instancia de evento con la parte del esquema

El ejemplo siguiente valida un evento DROP_TABLE con el esquema devuelto 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.