EVENTDATA (Transact-SQL)

Actualizado: 12 de diciembre de 2006

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


EVENTDATA( )

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 con otras rutinas, aunque un desencadenador se encargue de llamar 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.

ms173781.Caution(es-es,SQL.90).gifAdvertencia:
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. El esquema devuelto para cada evento se compone de elementos anidados dentro de un elemento <EVENT_INSTANCE>. Para obtener el esquema devuelto para un evento, utilice Índice o Buscar para localizar el tema del evento en los Libros en pantalla de SQL Server. Los nombres de propiedades enumerados para el evento corresponden a elementos devueltos en el esquema, con las siguientes excepciones:

  • EVENTDATA devuelve un elemento <ServerName>, en lugar de <SQLInstance> y <ComputerName>.
  • EVENTDATA devuelve un elemento <EventType> adicional.

Por ejemplo, el evento ALTER_TABLE devuelve el esquema siguiente:

<EVENT_INSTANCE>
    <EventType>type</EventType>
    <PostTime>date-time</PostTime>
    <SPID>spid</SPID>
    <ServerName>name</ServerName>
    <LoginName>name</LoginName>
    <UserName>name</UserName>
    <DatabaseName>name</DatabaseName>
    <SchemaName>name</SchemaName>
    <ObjectName>name</ObjectName>
    <ObjectType>type</ObjectType>
    <TSQLCommand>command</TSQLCommand>
</EVENT_INSTANCE>

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 XQuery con el tipo de datos xml.

ms173781.note(es-es,SQL.90).gifNota:
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 AdventureWorks;
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
ms173781.note(es-es,SQL.90).gifNota:
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 utilizando XQuery con los datos XML generados por EVENTDATA.

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

Versión Historial

12 de diciembre de 2006

Contenido nuevo:
  • Se ha agregado que EVENTDATA también se puede utilizar dentro del cuerpo de un desencadenador logon. Los desencadenadores logon se introdujeron en el Service Pack 2 de SQL Server.

Adiciones de comunidad

AGREGAR
Mostrar: