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
Уведомления о событиях
Триггеры входа