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

Область применения: SQL Server

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

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

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

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

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

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

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

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

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

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

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

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

См. также

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