CREATE EVENT NOTIFICATION (Transact-SQL)

更新日期: 2007 年 9 月 15 日

创建可向 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
    将通知的作用域应用于当前数据库中的特定队列。 仅已指定 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 事件消息类型和约定。 有关详细信息,请参阅Creating Service Broker Services

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

  • { '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 目标服务的详细信息,请参阅 Introduction to Service Broker Programming

ms189453.note(zh-cn,SQL.90).gif重要提示:
应针对向远程服务器中的 Service Broker 发送消息的事件通知配置 Service Broker 对话安全模式。 必须根据完全安全模式手动配置对话安全设置。 有关详细信息,请参阅事件通知的对话安全模式

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

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

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

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

权限

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

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

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

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

示例

ms189453.note(zh-cn,SQL.90).gif注意:
在示例 A 和 B 中,TO SERVICE'NotifyService' 子句中给定的 GUID ('8140a771-3c4b-4479-8ac0-81008ab17984') 仅适用于设置了示例的计算机。 对于该计算机实例,此 GUID 为 AdventureWorks 数据库的 GUID。 若要复制并运行这些示例,您需要用计算机和 SQL Server 实例的 GUID 来替换此 GUID。 如以上“参数”部分中的 { 'broker_instance_specifier' | 'current database' } 定义所述,可以通过查询 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'

请参阅

参考

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 帮助

更改历史记录

发布日期 历史记录

2005 年 12 月 5 日

新增内容:
  • 向 WITH FAN_IN 子句的说明中添加了更多明确解释。
  • 添加了可将用户导向有关针对指向远程服务器的事件通知配置 Service Broker对话安全设置的单独说明的重要说明。

2007 年 9 月 15 日

新增内容:
  • 添加了在运行示例中的代码时替换 GUID 的说明。