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

Применимо к: даSQL Server (все поддерживаемые версии)

Уведомления о событии отправляют данные о событиях в службу Компонент Service Broker . Уведомления о событиях выполняются в ответ на множество инструкций языка определения данных (DDL) Transact-SQL и на события трассировки SQL; уведомления отправляют сведения об этих событиях службе компонента Компонент Service Broker .

Уведомления о событиях можно использовать следующим образом.

  • Регистрировать и просматривать изменения или активность базы данных.

  • Выполнять действия в ответ на события в асинхронном режиме, а не синхронном.

Уведомления о событиях предоставляют программную альтернативу триггерам DDL и использованию приложения трассировки SQL.

Преимущества уведомлений о событиях

Уведомления о событиях запускаются асинхронно, вне области транзакции. Поэтому, в отличие от триггеров DDL, уведомления о событиях можно использовать внутри приложений баз данных и реагировать на события, не требуя ресурсов, выделяемых для немедленной транзакции.

В отличие от трассировок SQL, уведомления о событиях могут использоваться для выполнения действий в ответ на события трассировки SQL внутри экземпляра SQL Server .

Данные события могут использоваться приложениями, запускаемыми вместе с SQL Server для отслеживания изменений и принятия решений. Например, следующее уведомление о событии отправляет сообщение определенной службе каждый раз, когда инструкция ALTER TABLE выполняется в образце базы данных AdventureWorks2012 .

USE AdventureWorks2012;  
GO  
CREATE EVENT NOTIFICATION NotifyALTER_T1  
ON DATABASE  
FOR ALTER_TABLE  
TO SERVICE '//Adventure-Works.com/ArchiveService' ,  
    '8140a771-3c4b-4479-8ac0-81008ab17984';  

Основные понятия уведомлений о событиях

При создании уведомления о событии открывается один или несколько диалогов компонента Компонент Service Broker между экземпляром SQL Server и указанной целевой службой. Эти диалоги обычно остаются открытыми, пока уведомление о событии существует в виде объекта на экземпляре сервера. В некоторых случаях ввиду ошибок диалоги могут закрываться до удаления уведомления о событии. Эти диалоги никогда не разделяются между уведомлениями о событиях. Каждое уведомление о событии владеет собственными диалогами. Явное завершение диалога не дает конечной службе далее получать сообщения, и при следующем появлении события диалог повторно открываться не будет.

Сведения о событиях доставляются в службу Компонент Service Broker в виде переменной типа xml , содержащей сведения о том, когда произошло событие, о затронутом объекте базы данных, об использованном пакете инструкций Transact-SQL и т. д. Дополнительные сведения о схеме XML, создаваемой уведомлениями о событиях, см. в статье EVENTDATA (Transact-SQL).

Сравнение уведомлений о событиях и Триггеры

В следующей таблице сравниваются триггеры и уведомления о событиях и выявляются различия между ними.

Триггеры Уведомления о событиях
Триггеры DML срабатывают в ответ на события языка DML. Триггеры DDL срабатывают в ответ на события языка DDL. Уведомления о событиях срабатывают в ответ на события языка DDL и подмножество событий трассировки SQL.
Триггеры могут выполнять управляемый код Transact-SQL или CLR. Уведомления о событиях не могут выполнять код. Вместо этого они отправляют сообщения xml службе Service Broker.
Триггеры обрабатываются синхронно в области действия транзакций, вызвавших их срабатывание. Уведомления о событиях могут обрабатываться асинхронно и не выполняются в области действия транзакций, вызвавших их срабатывание.
Потребитель триггера тесным образом связан с событием, вызвавшим срабатывание триггера. Потребитель уведомления о событии не связан с событием, вызвавшим срабатывание триггера.
Триггеры должны обрабатываться на локальном сервере. Уведомления о событиях могут обрабатываться на удаленном сервере.
Для триггеров можно выполнить откат. Откат уведомлений о событиях невозможен.
Имена триггеров DML ограничены областью схемы. Имена триггеров DDL находятся в области видимости базы данных или сервера. Имена уведомлений о событиях находятся в области видимости сервера или базы данных. Уведомления о событии QUEUE_ACTIVATION находятся в области видимости определенной очереди.
Триггеры DML принадлежат тому же владельцу, что и таблицы, к которым они применяются. Уведомление о событии для очереди может принадлежать владельцу, отличному от владельца объекта, к которому оно применяется.
Триггеры поддерживают предложение EXECUTE AS. Уведомления о событиях не поддерживают предложение EXECUTE AS.
Сведения о событии триггера DDL могут быть захвачены с использованием функции EVENTDATA, которая возвращает тип данных xml . Уведомления о событиях направляют данные о событии в формате XML службе Service Broker. Данные форматируются по той же схеме, что и функция EVENTDATA.
Метаданные о триггерах отображаются в представлениях каталога sys.triggers и sys.server_triggers . Метаданные об уведомлениях о событиях отображаются в представлениях каталога sys.event_notifications и sys.server_event_notifications .

Сравнение уведомлений о событиях и Трассировка SQL

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

Трассировка SQL Уведомления о событиях
Инструмент трассировки SQL не приводит к снижению производительности из-за накладных расходов, связанных с транзакциями. Упаковка данных выполняется эффективно. С созданием данных о событиях в формате XML и отправлением уведомлений о событиях связаны накладные расходы.
Инструмент трассировки SQL поддерживает мониторинг любого класса событий трассировки. Уведомления о событиях позволяют осуществлять мониторинг подмножества классов событий трассировки и всех событий языка DDL.
Можно выбрать столбцы данных, которые будут создаваться при событии трассировки. Схема данных о событиях в формате XML, возвращаемых уведомлениями о событиях, фиксирована.
События трассировки DDL создаются всегда независимо от того, был ли выполнен откат инструкции DDL. В случае отката события в соответствующей инструкции DDL уведомления о событиях не создаются.
Управление промежуточным потоком данных о событиях трассировки связано с заполнением файлов или таблиц трассировки и управлением ими. Промежуточное управление данными уведомлений о событиях выполняется автоматически на основе очередей компонента Service Broker.
Трассировки нужно перезапускать при каждом перезапуске сервера. После регистрации уведомления о событиях объединяются в транзакции и остаются активными, несмотря на циклы в работе сервера.
После инициирования трассировок контролировать их создание невозможно. Для указания моментов инициирования трассировок можно использовать время остановки и время фильтрации. Доступ к трассировке осуществляется через соответствующий файл трассировки. Уведомления о событиях можно контролировать, выполняя инструкцию WAITFOR для очереди, которая получает сообщения, создаваемые уведомлениями о событиях. Доступ к уведомлениям можно получить, запросив данные из очереди.
Для создания трассировки необходимо как минимум разрешение ALTER TRACE. Для создания файла трассировки на соответствующем компьютере также требуется разрешение. Минимальное разрешение, необходимое для создания уведомления о событии, зависит от типа уведомления. Кроме того, необходимо разрешение RECEIVE, связанное с соответствующей очередью.
Данные трассировок можно получать в удаленном режиме. Уведомления о событиях можно получать в удаленном режиме.
События трассировок реализуются с использованием системных хранимых процедур. Уведомления о событиях реализованы с помощью сочетания инструкций Компонент Database Engine и Компонент Service BrokerTransact-SQL .
Данные событий трассировок можно получить программным образом, запросив соответствующую таблицу трассировки, проанализировав файл трассировки или воспользовавшись классом TraceReader системы SQL Server Management Objects (SMO). Данные событий можно получить программным образом, выполнив для этих данных, представленных в формате XML, запрос XQuery или воспользовавшись классами событий системы SMO.

Задачи уведомлений о событиях

Задача Раздел
Описывает создание и внедрение уведомлений о событиях. Реализация уведомлений о событиях
Описывает настройку безопасности диалога компонента Компонент Service Broker для уведомлений о событиях, отправляющих сообщения компоненту Service Broker или удаленному серверу. Настройка безопасности диалогов для уведомлений о событиях
Описывает методы возвращения сведений об уведомлениях о событиях. Получение сведений об уведомлениях о событиях

См. также

Триггеры DDL
Триггеры DML
Трассировка SQL