EVENTDATA (Transact-SQL)

Изменения: 12 декабря 2006 г.

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

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

Синтаксис

EVENTDATA( )

Замечания

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

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

ms173781.Caution(ru-ru,SQL.90).gifВнимание!
Функция EVENTDATA возвращает XML-данные. Эти данные отправляются клиенту в Юникоде, использующем 2 байта для представления каждого символа. XML-данные, возвращаемые функцией EVENTDATA, могут содержать следующие элементы Юникода. 0x0009 0x000A 0x000D >= 0x0020 && <= 0xD7FF >= 0xE000 && <= 0xFFFD Некоторые символы, встречающиеся в идентификаторах и данных Transact-SQL, не могут быть выражены в форме XML или не допускаются этим языком. Символы или данные с элементами кода, не указанными в приведенном выше списке, сопоставляются с вопросительным знаком (?).

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

Функция EVENTDATA возвращает значение типа xml. Схема, возвращаемая для каждого события, состоит из элементов, вложенных в элемент <EVENT_INSTANCE>. Чтобы получить схему, возвращенную для события, найдите в электронной документации по SQL Server посвященный этому событию раздел. Имена свойств события соответствуют возвращаемым в схеме элементам за следующими исключениями.

  • Вместо элементов <SQLInstance> и <ComputerName> функция EVENTDATA возвращает элемент <ServerName>.
  • Функция EVENTDATA возвращает дополнительный элемент <EventType>.

Например, для события ALTER_TABLE возвращается следующая схема.

<EVENT_INSTANCE>
    <EventType>type</EventType>
    <PostTime>date-time</PostTime>
    <SPID>spid</SPID>
    <ServerName>name</ServerName>
    <LoginName>name</LoginName>
    <UserName>name</UserName>
    <DatabaseName>name</DatabaseName>
    <SchemaName>name</SchemaName>
    <ObjectName>name</ObjectName>
    <ObjectType>type</ObjectType>
    <TSQLCommand>command</TSQLCommand>
</EVENT_INSTANCE>

Примеры

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

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

ms173781.note(ru-ru,SQL.90).gifПримечание.
При просмотре элемента <TSQLCommand> с помощью представления В виде сетки в среде SQL Server Management Studio символы разрыва строк в тексте команды не отображаются. Используйте вместо этого представление В виде текста.
USE AdventureWorks;
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
ms173781.note(ru-ru,SQL.90).gifПримечание.
Для возврата данных о событии рекомендуется использовать метод XQuery value(), а не query(). Метод query() возвращает XML-данные, содержащие символы возврата каретки и переноса строки (CR/LF), отделенные амперсандом, а метод value() не отображает эти символы.

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

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

USE AdventureWorks;
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
Проектирование уведомлений о событиях

Справка и поддержка

Получение помощи по SQL Server 2005

Журнал изменений

Версия Журнал

12 декабря 2006 г.

Новое содержимое
  • Добавлены сведения, что функцию EVENTDATA можно использовать в теле триггера входа. Триггеры входа появились в SQL Server с пакетом обновления 2 (SP2).