CREATE EVENT NOTIFICATION (Transact-SQL)

适用于:SQL ServerAzure SQL 托管实例

创建可向 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' }  
[ ; ]  

注意

若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-SQL 语法,请参阅早期版本文档

自变量

event_notification_name
事件通知名。 事件通知名必须符合标识符规则,且必须在创建事件通知的作用域内唯一:SERVER、DATABASE 或 object_name

SERVER
将事件通知的作用域应用于 SQL Server 的当前实例。 如果已指定,则只要 FOR 子句中的指定事件在 SQL Server 的实例中发生,便会激发通知。

备注

此选项在包含数据库中不可用。

DATABASE
将事件通知的作用域应用于当前数据库。 如果已指定,则只要 FOR 子句中的指定事件在当前数据库中发生,便会激发通知。

QUEUE
将通知的作用域应用于当前数据库中的特定队列。 仅已指定 FOR QUEUE_ACTIVATION 或 FOR BROKER_QUEUE_DISABLED 时,才能指定 QUEUE。

queue_name
应用事件通知的队列的名称。 仅在指定了 QUEUE 时才能指定 queue_name

WITH FAN_IN
指示 SQL Server 对于下列所有事件通知,仅为每个事件向所有指定服务发送一条消息:

  • 为同一事件创建。

  • 由同一主体事件(由相同 SID 标识)创建。

  • 指定的相同服务和 broker_instance_specifier

  • 指定 WITH FAN_IN。

例如,创建了三个事件通知。 所有事件通知指定 FOR ALTER_TABLE、WITH FAN_IN、相同的 TO SERVICE 子句,并且使用相同的 SID 创建。 运行 ALTER TABLE 语句时,这三个事件通知创建的消息将合并为一条消息。 因此,目标服务只接收一条事件消息。

event_type
导致执行事件通知的事件类型的名称。 event_type 可以为 Transact-SQL DDL 事件类型、SQL 跟踪事件类型或 Service Broker 事件类型。 有关限定 Transact-SQL DDL 事件类型的列表,请参阅 DDL 事件。 Service Broker 事件类型为 QUEUE_ACTIVATION 和 BROKER_QUEUE_DISABLED。 有关详细信息,请参阅 Event Notifications

event_group
Transact-SQL 或 SQL 跟踪事件类型的预定义组的名称。 可在执行属于事件组的任何事件后激发事件通知。 有关 DDL 事件组、事件组包含的 Transact-SQL 事件以及可定义事件组的作用域的列表,请参阅 DDL 事件组

当 CREATE EVENT NOTIFICATION 语句完成时,event_group 通过将其涵盖的事件类型添加到 sys.events 目录视图中,还可作为宏使用

'broker_service'
指定接收事件实例数据的目标服务。 SQL Server 为事件通知打开一个或多个与目标服务的会话。 该服务必须具有用于发送消息的相同 SQL Server 事件消息类型和约定。

在删除事件通知前,会话一直保持打开状态。 某些错误可能导致会话提前关闭。 显式结束部分或全部会话可能导致目标服务无法接收更多消息。

{ 'broker_instance_specifier' | 'current database' }
指定解析 broker_service 所依据的 Service Broker 实例。 特定 Service Broker 的值可通过查询 sys.databases 目录视图的 service_broker_guid 列来获取。 使用 'current database' 在当前数据库中指定 Service Broker 实例。 'current database' 是不区分大小写的文字字符串

注意

此选项在包含数据库中不可用。

备注

Service Broker 包括事件通知专用的消息类型和约定。 所以,无需创建 Service Broker 启动服务,因为已存在指定以下约定名称的启动服务:https://schemas.microsoft.com/SQL/Notifications/PostEventNotification

接收事件通知的目标服务必须使用此预先存在的约定。

重要

Service Broker 对话安全模式。 必须根据完全安全模式手动配置对话安全设置。 有关详细信息,请参阅配置事件通知的对话安全模式

如果激活通知的事件事务被回滚,则事件通知的发送也被回滚。 如果在触发器内提交或回滚事务,则触发器中定义的操作不会激发事件通知。 由于跟踪事件不与事务绑定,所以无论激活事件通知的事务是否被回滚,都会发送基于跟踪事件的事件通知。

如果服务器与目标服务之间的会话在激发事件通知后中断,则将报告一个错误并删除该事件通知。

事件通知是否成功发送不会影响最初启动该通知的事件事务。

将记录发送事件通知时的所有失败。

权限

若要创建以数据库为作用域 (ON DATABASE) 的事件通知,需要在当前数据库中具有 CREATE DATABASE DDL EVENT NOTIFICATION 权限。

若要对以服务器为作用域 (ON SERVER) 的 DDL 语句创建事件通知,需要在该服务器中具有 CREATE DDL EVENT NOTIFICATION 权限。

若要对跟踪事件创建事件通知,需要在服务器中具有 CREATE TRACE EVENT NOTIFICATION 权限。

若要创建以队列为作用域的事件通知,需要对该队列具有 ALTER 权限。

示例

注意

在下面的示例 A 和 B 中,TO SERVICE 'NotifyService' 子句中的 GUID ('8140a771-3c4b-4479-8ac0-81008ab17984') 特定于设置相应示例的计算机。 对于该实例,它是 AdventureWorks2022 数据库的 GUID。

若要复制和运行这些示例,需要将此 GUID 替换为你的计算机和 SQL Server 实例中的 GUID。 如上面的“参数”部分所述,可以通过查询 sys.databases 目录视图的 service_broker_guid 列获取 'broker_instance_specifier'。

A. 创建服务器范围的事件通知

以下示例创建使用 Service Broker 设置目标服务时所需的对象。 该目标服务引用专用于事件通知的启动服务的消息类型和约定。 然后对该目标服务创建一个事件通知,只要 SQL Server 实例发生 Object_Created 跟踪事件,便会发送一个通知。

--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. 创建以数据库为作用域的事件通知

以下示例将在上例所涉及的同一目标服务上创建事件通知。 在 AdventureWorks2022 示例数据库上发生 ALTER_TABLE 事件后会激发该事件通知。

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

C. 获取有关服务器范围的事件通知的信息

以下示例查询 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';  

另请参阅

事件通知
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)