Поделиться через


EVENTDATA (Transact-SQL)

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

Эта функция возвращает сведения о событиях сервера или базы данных. Когда создается уведомление о событии и результаты возвращаются на соответствующий компонент Service Broker, вызывается EVENTDATA. Также использование EVENTDATA поддерживается в триггерах DDL и триггерах входа.

Соглашения о синтаксисе Transact-SQL

Синтаксис

EVENTDATA( )

Замечания

Функция EVENTDATA возвращает данные только в том случае, если она вызвана непосредственно из триггера DDL или триггера входа. EVENTDATA всегда возвращает значение NULL, если ее вызывают другие подпрограммы, даже те, которые вызваны с помощью триггера DDL или триггера входа.

Данные, возвращаемые функцией EVENTDATA, становятся недопустимыми после транзакции, которая:

  • вызывает EVENTDATA явным образом;
  • вызывает EVENTDATA явным образом;
  • зафиксирована;
  • отменена.

Внимание

EVENTDATA возвращает данные в формате XML, которые передаются клиенту в кодировке Юникод с 2-байтовым представлением символов. EVENTDATA возвращает XML-код, который может представлять такие кодовые точки в Юникод:

0x0009

0x000A

0x000D

>= 0x0020 && <= 0xD7FF

>= 0xE000 && <= 0xFFFD

В XML невозможно выразить и использовать некоторые символы, встречающиеся в идентификаторах и данных Transact-SQL. Символы или данные с элементами кода, не указанными в приведенном выше списке, сопоставляются с вопросительным знаком (?).

Пароли не отображаются при выполнении инструкций CREATE LOGIN и ALTER LOGIN. Это сделано для безопасности входа.

Возвращаемые схемы

Функция EVENTDATA возвращает значение с типом данных xml. По умолчанию определение схемы для всех событий устанавливается в каталог C:\Program Files\Microsoft SQL Server\nnn\Tools\Binn\schemas\sqlserver\2006\11\events\events.xsd.

Кроме того, схема событий опубликована на веб-странице Microsoft SQL Server XML Schemas (Схемы XML Microsoft SQL Server).

Чтобы извлечь схему для какого-то конкретного события, нужно выполнить поиск в схеме для составного типа EVENT_INSTANCE_<event_type>. Например, чтобы извлечь схему для события DROP_TABLE, выполните поиск в схеме по EVENT_INSTANCE_DROP_TABLE.

Примеры

А. Запрос данных о событии в триггере DDL

В этом примере создается триггер DDL, который блокирует создание таблиц в базе данных. Применение запроса XQuery к XML-данным, созданным функцией EVENTDATA, позволяет получить инструкцию Transact-SQL, которая вызвала срабатывание триггера. Дополнительные сведения см. в статье Справочник по языку XQuery (SQL Server).

Примечание.

При использовании результатов в Сетке в SQL Server Management Studio для запроса <TSQLCommand> к элементу разрывы строк в тексте команды не отображаются. Используйте вместо этого представление В виде текста.

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  

Примечание.

Чтобы получить данные о событии используйте метод XQuery value(), а не query(). Метод query() возвращает XML-данные, содержащие символы возврата каретки и переноса строки (CR/LF), экранированные амперсандом, а метод value() не отображает эти символы.

B. Создание таблицы журнала с данными о событии в триггере DDL

В этом примере для хранения сведений обо всех событиях уровня базы данных создается таблица, которая заполняется триггером DDL. Применение запроса XQuery к XML-данным, созданным функцией EVENTDATA, позволяет получить тип события и инструкцию 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  

См. также

Использование функции EVENTDATA
Триггеры DDL
Уведомления о событиях
Триггеры входа