Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Применимо к:SQL Server
База данных
SQL AzureУправляемый экземпляр
SQL AzureБаза данных SQL в Microsoft Fabric
Эта функция возвращает сведения о событиях сервера или базы данных. Когда создается уведомление о событии и результаты возвращаются на соответствующий компонент 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. По умолчанию определение схемы для всех событий устанавливается в этом каталоге: <диск>:\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
Уведомления о событиях
Триггеры входа