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


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 или не допускаются этим языком. Символы или данные с элементами кода, не указанными в приведенном выше списке, сопоставляются с вопросительным знаком (?).

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

Функция EVENTDATA возвращает значение типа xml. По умолчанию определение схемы для всех событий устанавливается в следующем каталоге: C:\Program Files\Microsoft SQL Server\100\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 (компонент Database Engine).

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

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

USE AdventureWorks2008R2;
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 AdventureWorks2008R2;
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

В. Проверка экземпляра события для части схемы

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

IF EXISTS (SELECT * FROM sys.xml_schema_collections WHERE name='EventsXML')
DROP XML SCHEMA COLLECTION EventsXML ;
GO

DECLARE @x xml
SET @x = (SELECT * FROM OPENROWSET(BULK 'c:\Program Files\Microsoft SQL Server\90\Tools\Binn\schemas\sqlserver\2006\11\events\events.xsd', single_clob) AS x)
CREATE XML SCHEMA COLLECTION EventsXML AS @x ;
GO

DECLARE @x xml(XSDEVENTS)
DECLARE @y xml
DECLARE @n nvarchar(max)

SELECT @y = EVENTDATA()
SELECT @n = @y
SELECT @n = REPLACE(@n, '<EVENT_INSTANCE', '<EVENT_INSTANCE xmlns=''https://schemas.microsoft.com/sqlserver/2006/eventdata'' xmlns:xsi=''http://www.w3.org/2001/XMLSchema-instance'' xsi:type=''EVENT_INSTANCE_DROP_TABLE''')

SELECT @x = @n -- This causes the validation.