Уведомления о событиях
Уведомления о событии отправляют данные о событиях в службу Компонент 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 Broker Transact-SQL. |
Данные событий трассировок можно получить программным образом, запросив соответствующую таблицу трассировки, проанализировав файл трассировки или воспользовавшись классом TraceReader системы SQL Server Management Objects (SMO). |
Данные событий можно получить программным образом, выполнив для этих данных, представленных в формате XML, запрос XQuery или воспользовавшись классами событий системы SMO. |
Задачи уведомлений о событиях
Задача |
Раздел |
---|---|
Описывает создание и внедрение уведомлений о событиях. |
|
Описывает настройку безопасности диалога компонента Компонент Service Broker для уведомлений о событиях, отправляющих сообщения компоненту Service Broker или удаленному серверу. |
|
Описывает методы возвращения сведений об уведомлениях о событиях. |