CREATE EVENT NOTIFICATION (Transact-SQL)
适用于: SQL Server Azure 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 事件。 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)