Уведомления о событиях
Область применения: 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 для уведомлений о событиях, отправляющих сообщения в брокер служб на удаленном сервере. | Настройка безопасности диалогов для уведомлений о событиях |
Описывает методы возвращения сведений об уведомлениях о событиях. | Получение сведений об уведомлениях о событиях |