Поделиться через


CREATE EVENT NOTIFICATION (Transact-SQL)

Изменения: 15 сентября 2007 г.

Создает объект, отправляющий в службу компонента Service Broker данные о событии сервера или базы данных. Уведомления о событиях создаются только при помощи инструкций Transact-SQL.

Значок ссылки на разделСинтаксические обозначения в Transact-SQL

Синтаксис

CREATE EVENT NOTIFICATION event_notification_name 
ON { SERVER | DATABASE | QUEUE queue_name } 
[ WITH FAN_IN ]
FOR { event_type | event_group } [ ,...n ]
TO SERVICE 'broker_service' , { 'broker_instance_specifier' | 'current database' }
[ ; ]

Аргументы

  • event_notification_name
    Имя уведомления о событии. Имя уведомления о событии должно соответствовать правилам для идентификаторов, и оно должно быть уникальным в той области, где они были созданы: SERVER, DATABASE или object_name.
  • SERVER
    Применяет область уведомления о событии к текущему экземпляру SQL Server. Если задано это значение, уведомление срабатывает при каждом возникновении события, указанного в предложении FOR, на экземпляре SQL Server.
  • DATABASE
    Применяет область уведомления о событии к текущей базе данных. Если задано это значение, уведомление срабатывает при каждом возникновении в текущей базе данных события, указанного в предложении FOR.
  • QUEUE
    Применяет область уведомления о событии к определенной очереди в текущей базе данных. Параметр QUEUE можно указать, только если также указан параметр FOR QUEUE_ACTIVATION или FOR BROKER_QUEUE_DISABLED.
  • queue_name
    Имя очереди, к которой применяется уведомление о событии. Аргумент queue_name можно указать, только если задан параметр QUEUE.
  • WITH FAN_IN
    Служит для SQL Server указанием рассылать обозначенным службам только одно сообщение на событие для всех уведомлений о событиях, которые:

    • созданы в том же событии;
    • созданы тем же участником (который определен таким же идентификатором безопасности);
    • указывают ту же самую службу и broker_instance_specifier;
    • указывают WITH FAN_IN.

    Например, были созданы три уведомления о событии. Все уведомления о событии указывают параметры FOR ALTER_TABLE, WITH FAN_IN, предложение TO SERVICE и созданы тем же идентификатором безопасности. При выполнении инструкции ALTER TABLE сообщения, которые созданы этими тремя уведомлениями о событии, объединяются в одно. Поэтому целевая служба получает только одно сообщение о событии.

  • event_group
    Имя предопределенной группы типов событий Transact-SQL или SQL Trace. Возникновение любого события из группы может привести к срабатыванию уведомления о событии. Список групп событий DDL, содержащиеся в них события Transact-SQL и область их определения см. в разделе Группы событий DDL, используемые для уведомлений о событиях. Список групп событий трассировки и содержащиеся в них события трассировки см. в разделе Группы событий трассировки, используемые с уведомлениями о событиях.

    Аргумент event_group также выполняет функцию макроса, добавляя входящие в него типы событий к представлению каталога sys.events после завершения инструкции CREATE EVENT NOTIFICATION.

  • 'broker_service'
    Указывает конечный сервер, который получает данные о событиях экземпляра. SQL Server начинает один или несколько диалогов с целевой службой для уведомления о событии. Данная служба должна поддерживать тип сообщений о событиях SQL Server и контракт, использованный для отправки сообщения. Дополнительные сведения см. в разделе Creating Service Broker Services.

    Диалог остается открытым до удаления уведомления о событии. Некоторые ошибки могут привести к досрочному завершению диалогов. Явное завершение всех или некоторых диалогов может помешать конечной службе получать новые сообщения.

  • { 'broker_instance_specifier' | 'current database' }
    Указывает экземпляр компонента Service Broker, на котором выполняется broker_service. Значение для определенного компонента Service Broker может быть получено путем запроса столбца service_broker_guid представления каталога sys.databases. Чтобы указать экземпляр компонента Service Broker в текущей базе данных, используйте 'current database'. 'current database' — это нечувствительный к регистру строковый литерал.

Замечания

Компонент Service Broker включает в себя тип сообщения и контракт исключительно для уведомлений о событии. Таким образом, необязательно создавать службу, которая запускает компонент Service Broker, поскольку она уже существует и указывает следующее имя контракта: https://schemas.microsoft.com/SQL/Notifications/PostEventNotification

Конечная служба, принимающая уведомления о событии, должна поддерживать такой уже существующий контракт. Дополнительные сведения о создании целевых служб компонента Service Broker см. в разделе Introduction to Service Broker Programming.

ms189453.note(ru-ru,SQL.90).gifВажно!
Для уведомлений о событии, отправляющих сообщения компоненту Service Broker на удаленном сервере, необходимо настроить безопасность диалога. Безопасность диалога должна быть настроена вручную согласно модели полной безопасности. Дополнительные сведения см. в разделе Безопасность диалога для уведомлений о событиях.

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

Если диалог между сервером и конечной службой прерывается после срабатывания уведомления о событии, то появляется сообщение об ошибке, а уведомление о событии удаляется.

На транзакцию события, инициировавшую уведомление, не влияет успешность отправки уведомления о событии.

Все неудачные попытки отправки уведомления о событии заносятся в журнал.

Разрешения

Чтобы создать уведомление о событии в области базы данных (ON DATABASE), необходимо разрешение CREATE DATABASE DDL EVENT NOTIFICATION в текущей базе данных.

Чтобы создать уведомление о событии для инструкции DDL в области сервера (ON SERVER), необходимо разрешение CREATE DDL EVENT NOTIFICATION на сервере.

Чтобы создать уведомление о событии для события трассировки, необходимо разрешение CREATE TRACE EVENT NOTIFICATION на сервере.

Чтобы создать уведомление о событии в области очереди, необходимо разрешение ALTER для запроса.

Примеры

ms189453.note(ru-ru,SQL.90).gifПримечание.
В примерах A и B идентификатор GUID, указанный в предложении TO SERVICE'NotifyService' («8140a771-3c4b-4479-8ac0-81008ab17984»), специфичен для компьютера, на котором установлен пример. Для этого экземпляра компьютера, это был идентификатор GUID для базы данных AdventureWorks. Чтобы копировать и запустить эти примеры, необходимо заменить этот идентификатор GUID на идентификатор из вашего компьютера и экземпляра SQL Server. Как объяснялось выше в определении { «broker_instance_specifier» | «текущая база данных» } в разделе «Аргументы», можно получить «broker_instance_specifier» путем запроса столбца service_broker_guid представления каталога sys.databases.

А. Создание уведомления уровня сервера о событии

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

--Create a queue to receive messages.
CREATE QUEUE NotifyQueue ;
GO
--Create a service on the queue that references
--the event notifications contract.
CREATE SERVICE NotifyService
ON QUEUE NotifyQueue
([https://schemas.microsoft.com/SQL/Notifications/PostEventNotification]);
GO
--Create a route on the service to define the address 
--to which Service Broker sends messages for the service.
CREATE ROUTE NotifyRoute
WITH SERVICE_NAME = 'NotifyService',
ADDRESS = 'LOCAL';
GO
--Create the event notification.
CREATE EVENT NOTIFICATION log_ddl1 
ON SERVER 
FOR Object_Created 
TO SERVICE 'NotifyService',
    '8140a771-3c4b-4479-8ac0-81008ab17984' ;

Б. Создание уведомления уровня базы данных о событии

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

CREATE EVENT NOTIFICATION Notify_ALTER_T1
ON DATABASE
FOR ALTER_TABLE
TO SERVICE 'NotifyService',
    '8140a771-3c4b-4479-8ac0-81008ab17984';

В. Получение данных об уведомлении уровня сервера о событии

В следующем примере у представления каталога sys.server_event_notifications запрашиваются метаданные об уведомлении о событии log_ddl1, созданном в области сервера.

SELECT * FROM sys.server_event_notifications
WHERE name = 'log_ddl1'

Г. Получение сведений об уведомлении уровня базы данных о событии

В следующем примере у представления каталога sys.event_notifications запрашиваются метаданные об уведомлении о событии Notify_ALTER_T1, созданном на уровне базы данных.

SELECT * FROM sys.event_notifications
WHERE name = 'Notify_ALTER_T1'

См. также

Справочник

DROP EVENT NOTIFICATION (Transact-SQL)
EVENTDATA (Transact-SQL)
sys.event_notifications (Transact-SQL)
sys.server_event_notifications (Transact-SQL)
sys.events (Transact-SQL)
sys.server_events (Transact-SQL)

Другие ресурсы

Реализация уведомлений о событиях

Справка и поддержка

Получение помощи по SQL Server 2005

Журнал изменений

Версия Журнал

5 декабря 2005 г.

Добавления
  • Добавлено разъяснение предложения WITH FAN_IN.
  • Добавлено важное примечание, которое направляет пользователей к отдельному разделу о настройке безопасности диалога компонента Service Broker для уведомлений о событии, предназначенных для удаленных серверов.

15 сентября 2007 г.

Добавления
  • Добавлено примечание о замене идентификатора GUID при запуске кода в примерах.