CREATE EVENT NOTIFICATION (Transact-SQL)
创建可向 Service Broker 服务发送有关数据库或服务器事件的信息的对象。只能使用 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
将通知的作用域应用于当前数据库中的特定队列。仅已指定 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 事件。有关限定 SQL 跟踪事件类型的列表,请参阅用于事件通知的跟踪事件。Service Broker 事件类型为 QUEUE_ACTIVATION 和 BROKER_QUEUE_DISABLED。有关详细信息,请参阅设计事件通知。event_group
Transact-SQL 或 SQL Trace 事件类型的预定义组的名称。可在执行属于事件组的任何事件后激发事件通知。有关 DDL 事件组、事件组包含的 Transact-SQL 事件以及可定义事件组的作用域的列表,请参阅DDL 事件组。有关跟踪事件组及其所包含的跟踪事件的列表,请参阅事件通知使用的跟踪事件组。当 CREATE EVENT NOTIFICATION 语句完成时,event_group 通过将其涵盖的事件类型添加到 sys.events 目录视图中,还可作为宏使用。
'broker_service'
指定接收事件实例数据的目标服务。SQL Server 为事件通知打开一个或多个与目标服务的会话。该服务必须具有用于发送消息的相同 SQL Server 事件消息类型和约定。有关详细信息,请参阅创建 Service Broker 服务。在删除事件通知前,会话一直保持打开状态。某些错误可能导致会话提前关闭。显式结束部分或全部会话可能导致目标服务无法接收更多消息。
{ '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 目标服务的详细信息,请参阅 用 Service Broker 编程的优点。
重要提示 |
---|
应针对向远程服务器中的 Service Broker 发送消息的事件通知配置 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') 特定于设置相应示例的计算机。对于该实例,它是 AdventureWorks 数据库的 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. 创建以数据库为作用域的事件通知
以下示例将在上例所涉及的同一目标服务上创建事件通知。在 AdventureWorks 示例数据库上发生 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'