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


EVENTDATA (Transact-SQL)

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

Значок ссылки на раздел Синтаксические обозначения в Transact-SQL

Синтаксис

EVENTDATA( )

Замечания

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

Данные, возвращенные функцией EVENTDATA, недействительны до тех пор, пока не будет выполнена явная или неявная фиксация или откат вызвавшей ее транзакции.

ПредупреждениеВнимание!

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

0x0009

0x000A

0x000D

>= 0x0020 && <= 0xD7FF

>= 0xE000 && <= 0xFFFD

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

Чтобы обеспечить безопасность имен входа, при выполнении инструкций CREATE LOGIN или ALTER LOGIN пароли не отображаются.

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

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

Также схема события может быть опубликована на веб-узле Схемы XML Microsoft SQL Server.

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

Примеры

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

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

ПримечаниеПримечание

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

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
ПримечаниеПримечание

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

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

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

См. также

Основные понятия

Использование функции EVENTDATA

Триггеры DDL

Уведомления о событиях

Триггеры входа