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

参数

event_notification_name

事件通知的名称。 事件通知名称必须符合标识符规则,并且必须在创建标识符的作用域内是唯一的:SERVERDATABASEobject_name

SERVER

将事件通知的作用域应用于 SQL Server 的当前实例。 如果指定,则每当子句中的 FOR 指定事件出现在 SQL Server 实例中的任何位置时,通知将触发。

备注

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

DATABASE

将事件通知的作用域应用于当前数据库。 如果指定,则每当子句中的 FOR 指定事件在当前数据库中发生时,通知将触发。

QUEUE

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

queue_name

应用事件通知的队列的名称。 仅当指定时,才能指定QUEUE

与FAN_IN

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

  • 为同一事件创建。
  • 由同一主体事件(由相同 SID 标识)创建。
  • 指定的相同服务和 broker_instance_specifier
  • 指定 WITH FAN_IN

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

event_type

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

event_group

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

event_group在语句完成后,通过将它涵盖的事件类型添加到CREATE EVENT NOTIFICATION目录视图来充当宏sys.events

broker_service

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

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

{ “broker_instance_specifier” |“current database” }

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

备注

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

备注

Service Broker 包括事件通知专用的消息类型和约定。 因此,不必创建 Service Broker 发起服务,因为已存在一个指定以下协定名称的服务: http://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' ,子句 (8140a771-3c4b-4479-8ac0-81008ab17984) 中的 GUID 特定于在其中设置了该示例的计算机。 那次是AdventureWorks2025数据库的GUID。

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

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 ([http://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. 创建数据库范围内的事件通知

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