EVENTDATA (Transact-SQL)
Изменения: 12 декабря 2006 г.
Возвращает сведения о событиях сервера или базы данных. Функция EVENTDATA вызывается при уведомлении о событии, а результаты ее работы возвращаются указанному компоненту Service Broker. Кроме того, ее можно использовать в теле триггера DDL или триггера входа.
Синтаксические обозначения в Transact-SQL
Синтаксис
EVENTDATA( )
Замечания
Функция EVENTDATA возвращает данные только в том случае, если она вызвана непосредственно из триггера DDL или триггера входа. При вызове из других подпрограмм, даже вызванных триггером, функция EVENTDATA возвращает значение NULL.
Данные, возвращенные функцией EVENTDATA, недействительны до тех пор, пока не будет выполнена явная или неявная фиксация или откат вызвавшей ее транзакции.
Внимание! |
---|
Функция 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.
Примечание. |
---|
При просмотре элемента <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
Примечание. |
---|
Для возврата данных о событии рекомендуется использовать метод 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 г. |
|