Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Область применения: SQL Server Управляемый экземпляр SQL Azure
Создает объект, который отправляет сведения о событии базы данных или сервера в службу 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или DATABASEobject_name.
SERVER
Применяет область уведомления о событии к текущему экземпляру SQL Server. Если указано, уведомление запускается всякий раз, когда указанное событие в FOR предложении происходит в любом месте экземпляра SQL Server.
Примечание.
Этот параметр недоступен в автономной базе данных.
DATABASE
Применяет область уведомления о событии к текущей базе данных. Если указано, уведомление запускается всякий раз, когда указанное событие в FOR предложении происходит в текущей базе данных.
ОЧЕРЕДЬ
Применяет область уведомления о событии к определенной очереди в текущей базе данных.
QUEUE можно указать только в том случае, если FOR QUEUE_ACTIVATION он FOR BROKER_QUEUE_DISABLED также указан.
queue_name
Имя очереди, к которой применяется уведомление о событии.
queue_name можно указать только в том случае, если QUEUE задано.
С FAN_IN
Служит для SQL Server указанием рассылать обозначенным службам только одно сообщение на событие для всех уведомлений о событиях, которые:
- созданы в том же событии;
- созданы тем же участником (который определен таким же идентификатором безопасности);
- указывают ту же службу и broker_instance_specifier;
- Укажите
WITH FAN_IN.
Например, были созданы три уведомления о событии. Все уведомления о событиях указывают FOR ALTER_TABLE, WITH FAN_INодно и то же TO SERVICE предложение и создаются с помощью одного и того же идентификатора безопасности.
ALTER TABLE При запуске инструкции сообщения, созданные этими тремя уведомлениями о событиях, объединяются в одну. Поэтому целевая служба получает только одно сообщение о событии.
event_type
Имя типа события, вызывающего выполнение уведомления о событии. Аргумент event_type может быть типом события DDL Transact-SQL, трассировки SQL или типом события Service Broker. Список подходящих типов событий DDL Transact-SQL см. в разделе DDL-события. Типы событий Service Broker:QUEUE_ACTIVATIONBROKER_QUEUE_DISABLED Дополнительные сведения см. в разделе "Уведомления о событиях".
event_group
Имя предопределенной группы событий Transact-SQL или типов событий трассировки SQL. Возникновение любого события из группы может привести к срабатыванию уведомления о событии. Список групп DDL-событий, содержащихся в них событий Transact-SQL и область их определения см. в разделе Группы DDL-событий.
event_group также выступает в качестве макроса, когда CREATE EVENT NOTIFICATION оператор завершает работу, добавив типы событий, которые он охватывает в sys.events представление каталога.
"broker_service"
Указывает целевую службу, получающую данные о событиях экземпляра. SQL Server начинает один или несколько диалогов с целевой службой для уведомления о событии. Данная служба должна поддерживать тип сообщений о событиях SQL Server и контракт, использованный для отправки сообщения.
Диалог остается открытым до удаления уведомления о событии. Некоторые ошибки могут привести к досрочному завершению диалогов. Явное завершение всех или некоторых диалогов может помешать конечной службе получать новые сообщения.
{ "broker_instance_specifier" | "Текущая база данных" }
Указывает экземпляр компонента Service Broker, на котором выполняется broker_service. Значение для определенного service_broker_guid брокера служб можно получить, запрашивая sys.databases столбец представления каталога. Используется 'current database' для указания экземпляра компонента Service Broker в текущей базе данных.
'current database' — это литерал строки без учета регистра.
Примечание.
Этот параметр недоступен в автономной базе данных.
Замечания
Service Broker включает в себя тип сообщений и контракт исключительно для уведомлений о событии. Поэтому службе, инициирующей Service Broker, не нужно создавать, так как она уже существует, указывающая следующее имя контракта: http://schemas.microsoft.com/SQL/Notifications/PostEventNotification
Целевая служба, принимающая уведомления о событиях, должна поддерживать такой уже существующий контракт.
Внимание
Безопасность диалогового окна Service Broker должна быть настроена для уведомлений о событиях, отправляющих сообщения в брокер служб на удаленном сервере. Безопасность диалога должна быть настроена вручную согласно модели полной безопасности. Дополнительные сведения см. в разделе Настройка безопасности диалогов для уведомлений о событиях.
Если происходит откат транзакции события, активирующей уведомление, то же происходит и с отправкой уведомления о событии. Уведомления о событиях не запускаются действием, определенным в триггере, когда транзакция фиксируется или откатывается внутри триггера. Так как события трассировки не привязаны к транзакциям, уведомления о событиях трассировки отправляются независимо от того, выполняется ли откат транзакции, активируемой ими.
Если диалог между сервером и конечной службой прерывается после срабатывания уведомления о событии, то появляется сообщение об ошибке, а уведомление о событии удаляется.
Транзакция события, которая первоначально запустила уведомление, не влияет на успех или сбой отправки уведомления о событии.
Все неудачные попытки отправки уведомления о событии заносятся в журнал.
Разрешения
Чтобы создать уведомление о событии, которое распространяется на базу данных (ON DATABASE), требуется CREATE DATABASE DDL EVENT NOTIFICATION разрешение в текущей базе данных.
Чтобы создать уведомление о событии для инструкции DDL, которая ограничена сервером (ON SERVER), требуется CREATE DDL EVENT NOTIFICATION разрешение на сервере.
Чтобы создать уведомление о событии трассировки, требуется CREATE TRACE EVENT NOTIFICATION разрешение на сервере.
Чтобы создать уведомление о событии, заданное в очереди, требуется ALTER разрешение на очередь.
Примеры
Примечание.
В примерах A и B GUID в TO SERVICE 'NotifyService' предложении (8140a771-3c4b-4479-8ac0-81008ab17984) зависит от компьютера, на котором был настроен пример. В том случае это был GUID для базы данных AdventureWorks2025.
Чтобы копировать и запустить эти примеры, необходимо заменить этот идентификатор GUID на идентификатор из вашего компьютера и экземпляра SQL Server. Как описано в разделе "Аргументы" , можно получить 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 ([http://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';
B. Создание уведомления о событии с областью действия базы данных
В следующем примере создается уведомление о событии для той же службы, что и в предыдущем примере. Уведомление о событии срабатывает после того, как ALTER_TABLE событие появится в образцовой базе данных AdventureWorks2025.
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';
D. Получение сведений о уведомлении о событии, которое является областью действия базы данных
В следующем примере у представления каталога sys.event_notifications запрашиваются метаданные об уведомлении о событии Notify_ALTER_T1, созданном на уровне базы данных.
SELECT *
FROM sys.event_notifications
WHERE name = 'Notify_ALTER_T1';