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 temas 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 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 (?).

Para proteger la seguridad de los inicios de sesión, cuando se ejecutan las instrucciones CREATE LOGIN o ALTER LOGIN, las contraseñas no se muestran.

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\110\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.

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 del lenguaje XQuery (SQL Server).

[!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 AdventureWorks2012;
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 AdventureWorks2012;
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

Vea también

Conceptos

Usar la función EVENTDATA

Desencadenadores DDL

Notificaciones de eventos

Desencadenadores logon