EVENTDATA (Transact-SQL)
Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance
Esta función 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. Un desencadenador DDL o LOGON también admite el uso interno de EVENTDATA
.
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 otras rutinas lo llaman, incluso si un desencadenador DDL o LOGON llama a esas rutinas.
Los datos que EVENTDATA
devuelve no son válidos después de una transacción que
- llamó a
EVENTDATA
de manera explícita - llamó a
EVENTDATA
de manera implícita - se confirma
- se revierte
Precaución
EVENTDATA
devuelve datos de XML, enviados al cliente como Unicode que usa 2 bytes para cada carácter. EVENTDATA
devuelve XML que puede representar estos puntos de código de Unicode:
0x0009
0x000A
0x000D
>= 0x0020 && <= 0xD7FF
>= 0xE000 && <= 0xFFFD
XML no puede expresar, ni permitirá, algunos caracteres que pueden aparecer en los datos e identificadores de Transact-SQL. 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 (?).
Las contraseñas no se muestran cuando se ejecutan las instrucciones CREATE LOGIN
o ALTER LOGIN
. Esto protege la seguridad del inicio de sesión.
Esquemas devueltos
EVENTDATA devuelve un valor de tipo de datos xml. De manera predeterminada, la definición de esquema para todos los eventos se instala en este directorio: C:\Program Files\Microsoft SQL Server\nnnTools\Binn\schemas\sqlserver\2006\11\events\events.xsd.
La página web Esquemas XML de Microsoft SQL Server también tiene el esquema de eventos.
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 este ejemplo se crea un desencadenador DDL que impide la creación de nuevas tablas de bases de datos. El uso de XQuery con los datos XML generados por EVENTDATA
captura la instrucción Transact-SQL que activa el desencadenador. Consulte Referencia del lenguaje XQuery (SQL Server) para más información.
Nota
Cuando se usa Resultados a cuadrícula en SQL Server Management Studio para consultar el elemento <TSQLCommand>
, no se muestran los saltos de línea en el texto del comando. Es preferible usar Resultados a texto.
USE AdventureWorks2022;
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
Para devolver datos de evento, use el método XQuery value() en lugar 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 este ejemplo se crea una tabla para almacenar información sobre todos los eventos de nivel de base de datos y rellena esa tabla con un desencadenador DDL. El uso de XQuery con los datos XML generados por EVENTDATA
captura el tipo de evento y la instrucción Transact-SQL.
USE AdventureWorks2022;
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
Consulte también
Usar la función EVENTDATA
Desencadenadores DDL
Notificaciones de eventos
Desencadenadores logon