CREATE EVENT NOTIFICATION (Transact-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' }
[ ; ]

参数

  • 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_group
    Transact-SQL 或 SQL Trace 事件类型的预定义组的名称。 可在执行属于事件组的任何事件后激发事件通知。 有关 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 发送消息的事件通知配置 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') 特定于设置相应示例的计算机。 对于该实例,它是 AdventureWorks2012 数据库的 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.创建以数据库为作用域的事件通知

以下示例将在上例所涉及的同一目标服务上创建事件通知。 在 AdventureWorks2012 示例数据库上发生 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)

概念

事件通知