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.
Convenciones de sintaxis de Transact-SQL
Sintaxis
EVENTDATA( )
Notas
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.
![]() |
---|
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>
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 XQuery con el tipo de datos xml.
[!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 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
[!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 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
Vea también
Otros recursos
Usar la función EVENTDATA
Diseñar desencadenadores DDL
Diseñar notificaciones de eventos
Ayuda e información
Obtener ayuda sobre SQL Server 2005
Historial de cambios
Versión | Historial |
---|---|
12 de diciembre de 2006 |
|