CREATE EVENT NOTIFICATION (Transact-SQL)CREATE EVENT NOTIFICATION (Transact-SQL)

Применимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) Применимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions)

Создает объект, отправляющий в службу компонента Service Broker данные о событии сервера или базы данных.Creates an object that sends information about a database or server event to a service broker service. Уведомления о событиях создаются только при помощи инструкций Transact-SQLTransact-SQL.Event notifications are created only by using Transact-SQLTransact-SQL statements.

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

СинтаксисSyntax

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' }  
[ ; ]  

Примечание

Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.

АргументыArguments

event_notification_nameevent_notification_name
Имя уведомления о событии.Is the name of the event notification. Имя уведомления о событии должно соответствовать правилам для идентификаторов, и оно должно быть уникальным в той области, где они были созданы: SERVER, DATABASE или object_name.An event notification name must comply with the rules for identifiers and must be unique within the scope in which they are created: SERVER, DATABASE, or object_name.

SERVERSERVER
Применяет область уведомления о событии к текущему экземпляру SQL ServerSQL Server.Applies the scope of the event notification to the current instance of SQL ServerSQL Server. Если задано это значение, уведомление срабатывает при каждом возникновении события, указанного в предложении FOR, на экземпляре SQL ServerSQL Server.If specified, the notification fires whenever the specified event in the FOR clause occurs anywhere in the instance of SQL ServerSQL Server.

Примечание

Этот параметр недоступен в автономной базе данных.This option is not available in a contained database.

DATABASEDATABASE
Применяет область уведомления о событии к текущей базе данных.Applies the scope of the event notification to the current database. Если задано это значение, уведомление срабатывает при каждом возникновении в текущей базе данных события, указанного в предложении FOR.If specified, the notification fires whenever the specified event in the FOR clause occurs in the current database.

QUEUEQUEUE
Применяет область уведомления о событии к определенной очереди в текущей базе данных.Applies the scope of the notification to a specific queue in the current database. Параметр QUEUE можно указать, только если также указан параметр FOR QUEUE_ACTIVATION или FOR BROKER_QUEUE_DISABLED.QUEUE can be specified only if FOR QUEUE_ACTIVATION or FOR BROKER_QUEUE_DISABLED is also specified.

queue_namequeue_name
Имя очереди, к которой применяется уведомление о событии.Is the name of the queue to which the event notification applies. Аргумент queue_name можно указать, только если задан параметр QUEUE.queue_name can be specified only if QUEUE is specified.

WITH FAN_INWITH FAN_IN
Служит для SQL ServerSQL Server указанием рассылать обозначенным службам только одно сообщение на событие для всех уведомлений о событиях, которые:Instructs SQL ServerSQL Server to send only one message per event to any specified service for all event notifications that:

  • созданы в том же событии;Are created on the same event.

  • созданы тем же участником (который определен таким же идентификатором безопасности);Are created by the same principal (as identified by the same SID).

  • указывают ту же службу и broker_instance_specifier;Specify the same service and broker_instance_specifier.

  • указывают WITH FAN_IN.Specify WITH FAN_IN.

Например, были созданы три уведомления о событии.For example, three event notifications are created. Все уведомления о событии указывают параметры FOR ALTER_TABLE, WITH FAN_IN, предложение TO SERVICE и созданы тем же идентификатором безопасности.All event notifications specify FOR ALTER_TABLE, WITH FAN_IN, the same TO SERVICE clause, and are created by the same SID. При выполнении инструкции ALTER TABLE сообщения, которые созданы этими тремя уведомлениями о событии, объединяются в одно.When an ALTER TABLE statement is run, the messages that are created by these three event notifications are merged into one. Поэтому целевая служба получает только одно сообщение о событии.Therefore, the target service receives only one message of the event.

event_typeevent_type
Имя типа события, которое вызывает уведомление о событии.Is the name of an event type that causes the event notification to execute. Аргумент event_type может быть типом события DDL Transact-SQLTransact-SQL, трассировки SQL или типом события Компонент Service BrokerService Broker.event_type can be a Transact-SQLTransact-SQL DDL event type, a SQL Trace event type, or a Компонент Service BrokerService Broker event type. Список подходящих типов событий DDL Transact-SQLTransact-SQL см. в разделе DDL-события.For a list of qualifying Transact-SQLTransact-SQL DDL event types, see DDL Events. QUEUE_ACTIVATION и BROKER_QUEUE_DISABLED являются типами событий компонента Компонент Service BrokerService Broker.Компонент Service BrokerService Broker event types are QUEUE_ACTIVATION and BROKER_QUEUE_DISABLED. Дополнительные сведения см. в разделе Event Notifications.For more information, see Event Notifications.

event_groupevent_group
Имя предопределенной группы типов событий Transact-SQLTransact-SQL или трассировки SQL.Is the name of a predefined group of Transact-SQLTransact-SQL or SQL Trace event types. Возникновение любого события из группы может привести к срабатыванию уведомления о событии.An event notification can fire after execution of any event that belongs to an event group. Список групп DDL-событий, содержащихся в них событий Transact-SQLTransact-SQL и область их определения см. в разделе Группы DDL-событий.For a list of DDL event groups, the Transact-SQLTransact-SQL events they cover, and the scope at which they can be defined, see DDL Event Groups.

Аргумент event_group также выполняет функцию макроса, добавляя входящие в него типы событий к представлению каталога sys.events после завершения инструкции CREATE EVENT NOTIFICATION.event_group also acts as a macro, when the CREATE EVENT NOTIFICATION statement finishes, by adding the event types it covers to the sys.events catalog view.

' broker_service '' broker_service '
Указывает целевую службу, получающую данные о событиях экземпляра.Specifies the target service that receives the event instance data. SQL ServerSQL Server начинает один или несколько диалогов с целевой службой для уведомления о событии.opens one or more conversations to the target service for the event notification. Данная служба должна поддерживать тип сообщений о событиях SQL ServerSQL Server и контракт, использованный для отправки сообщения.This service must honor the same SQL ServerSQL Server Events message type and contract that is used to send the message.

Диалог остается открытым до удаления уведомления о событии.The conversations remain open until the event notification is dropped. Некоторые ошибки могут привести к досрочному завершению диалогов.Certain errors could cause the conversations to close earlier. Явное завершение всех или некоторых диалогов может помешать конечной службе получать новые сообщения.Ending some or all conversations explicitly might prevent the target service from receiving more messages.

{ ' broker_instance_specifier ' | 'current database' }{ 'broker_instance_specifier' | 'current database' }
Указывает экземпляр компонента Service Broker, на котором выполняется broker_service.Specifies a service broker instance against which broker_service is resolved. Значение для определенного компонента Service Broker может быть получено путем запроса столбца service_broker_guid представления каталога sys.databases.The value for a specific service broker can be acquired by querying the service_broker_guid column of the sys.databases catalog view. Чтобы указать экземпляр компонента Service Broker в текущей базе данных, используйте 'current database'.Use 'current database' to specify the service broker instance in the current database. 'current database' — это нечувствительный к регистру строковый литерал.'current database' is a case-insensitive string literal.

Примечание

Этот параметр недоступен в автономной базе данных.This option is not available in a contained database.

RemarksRemarks

Компонент Компонент Service BrokerService Broker включает в себя тип сообщений и контракт исключительно для уведомлений о событии.Компонент Service BrokerService Broker includes a message type and contract specifically for event notifications. Таким образом, необязательно создавать службу, которая запускает компонент Service Broker, поскольку она уже существует и указывает следующее имя контракта: https://schemas.microsoft.com/SQL/Notifications/PostEventNotification.Therefore, a Service Broker initiating service does not have to be created because one already exists that specifies the following contract name: https://schemas.microsoft.com/SQL/Notifications/PostEventNotification

Целевая служба, принимающая уведомления о событиях, должна поддерживать такой уже существующий контракт.The target service that receives event notifications must honor this preexisting contract.

Важно!

Компонент Service BrokerService Broker на удаленном сервере, необходимо настроить безопасность диалога.dialog security should be configured for event notifications that send messages to a service broker on a remote server. Безопасность диалога должна быть настроена вручную согласно модели полной безопасности.Dialog security must be configured manually according to the full security model. Дополнительные сведения см. в разделе Настройка безопасности диалогов для уведомлений о событиях.For more information, see Configure Dialog Security for Event Notifications.

Если происходит откат транзакции события, активирующей уведомление, то же происходит и с отправкой уведомления о событии.If an event transaction that activates a notification is rolled back, the sending of the event notification is also rolled back. Уведомления о событиях не срабатывают в результате действий, определенных триггерами, когда происходит завершение или откат транзакции внутри триггера.Event notifications do not fire by an action defined in a trigger when the transaction is committed or rolled back inside the trigger. Учитывая то, что события трассировки не связаны транзакциями, уведомления о событиях, основанные на событиях трассировки, отправляются вне зависимости от того, происходит ли откат активировавшей их транзакции.Because trace events are not bound by transactions, event notifications based on trace events are sent regardless of whether the transaction that activates them is rolled back.

Если диалог между сервером и конечной службой прерывается после срабатывания уведомления о событии, то появляется сообщение об ошибке, а уведомление о событии удаляется.If the conversation between the server and the target service is broken after an event notification fires, an error is reported and the event notification is dropped.

На транзакцию события, инициировавшую уведомление, не влияет успешность отправки уведомления о событии.The event transaction that originally started the notification is not affected by the success or failure of the sending of the event notification.

Все неудачные попытки отправки уведомления о событии заносятся в журнал.Any failure to send an event notification is logged.

РазрешенияPermissions

Чтобы создать уведомление о событии в области базы данных (ON DATABASE), необходимо разрешение CREATE DATABASE DDL EVENT NOTIFICATION в текущей базе данных.To create an event notification that is scoped to the database (ON DATABASE), requires CREATE DATABASE DDL EVENT NOTIFICATION permission in the current database.

Чтобы создать уведомление о событии для инструкции DDL в области сервера (ON SERVER), необходимо разрешение CREATE DDL EVENT NOTIFICATION на сервере.To create an event notification on a DDL statement that is scoped to the server (ON SERVER), requires CREATE DDL EVENT NOTIFICATION permission in the server.

Чтобы создать уведомление о событии для события трассировки, необходимо разрешение CREATE TRACE EVENT NOTIFICATION на сервере.To create an event notification on a trace event, requires CREATE TRACE EVENT NOTIFICATION permission in the server.

Чтобы создать уведомление о событии в области очереди, необходимо разрешение ALTER для запроса.To create an event notification that is scoped to a queue, requires ALTER permission on the queue.

ПримерыExamples

Примечание

В примерах A и B, идентификатор GUID, указанный в предложении TO SERVICE 'NotifyService' («8140a771-3c4b-4479-8ac0-81008ab17984») специфичен для компьютера, на котором установлен пример.In Examples A and B below, the GUID in the TO SERVICE 'NotifyService' clause ('8140a771-3c4b-4479-8ac0-81008ab17984') is specific to the computer on which the example was set up. Для этого экземпляра использовался идентификатор GUID для базы данных AdventureWorks2012AdventureWorks2012.For that instance, that was the GUID for the AdventureWorks2012AdventureWorks2012 database.

Чтобы копировать и запустить эти примеры, необходимо заменить этот идентификатор GUID на идентификатор из вашего компьютера и экземпляра SQL ServerSQL Server.To copy and run these examples, you need to replace this GUID with one from your computer and SQL ServerSQL Server instance. Как объясняется выше в разделе "Аргументы", ' broker_instance_specifier ' можно получить с помощью запроса к столбцу service_broker_guid представления каталога sys.databases.As explained in the Arguments section above, you can acquire the 'broker_instance_specifier' by querying the service_broker_guid column of the sys.databases catalog view.

A.A. Создание уведомления о событии уровня сервераCreating an event notification that is server scoped

В следующем примере создаются объекты, необходимые для установки целевой службы при помощи компонента Компонент Service BrokerService Broker.The following example creates the required objects to set up a target service using Компонент Service BrokerService Broker. Конечная служба ссылается на тип сообщения и контракт вызывающей стороны исключительно для уведомлений о событиях.The target service references the message type and contract of the initiating service specifically for event notifications. Затем уведомление о событии создается в конечной службе, которая начинает рассылку уведомлений в ответ на событие трассировки Object_Created на экземпляре SQL ServerSQL Server.Then an event notification is created on that target service that sends a notification whenever an Object_Created trace event happens on the instance of SQL ServerSQL 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' ;  

Б.B. Создание уведомления о событии уровня базы данныхCreating an event notification that is database scoped

В следующем примере создается уведомление о событии для той же службы, что и в предыдущем примере.The following example creates an event notification on the same target service as the previous example. Уведомление о событии срабатывает в ответ на событие ALTER_TABLE в образце базы данных AdventureWorks2012AdventureWorks2012.The event notification fires after an ALTER_TABLE event occurs on the AdventureWorks2012AdventureWorks2012 sample database.

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

В.C. Получение данных об уведомлении о событии уровня сервераGetting information about an event notification that is server scoped

В следующем примере у представления каталога sys.server_event_notifications запрашиваются метаданные об уведомлении о событии log_ddl1, созданном в области сервера.The following example queries the sys.server_event_notifications catalog view for metadata about event notification log_ddl1 that was created with server scope.

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

Г.D. Получение сведений об уведомлении о событии уровня базы данныхGetting information about an event notification that is database scoped

В следующем примере у представления каталога sys.event_notifications запрашиваются метаданные об уведомлении о событии Notify_ALTER_T1, созданном на уровне базы данных.The following example queries the sys.event_notifications catalog view for metadata about event notification Notify_ALTER_T1 that was created with database scope.

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

См. также:See Also

Уведомления о событиях Event Notifications
DROP EVENT NOTIFICATION (Transact-SQL) DROP EVENT NOTIFICATION (Transact-SQL)
EVENTDATA (Transact-SQL) EVENTDATA (Transact-SQL)
sys.event_notifications (Transact-SQL) sys.event_notifications (Transact-SQL)
sys.server_event_notifications (Transact-SQL) sys.server_event_notifications (Transact-SQL)
sys.event (Transact-SQL) sys.events (Transact-SQL)
sys.server_events (Transact-SQL)sys.server_events (Transact-SQL)