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.
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.
Advertencia |
---|
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