事件通知是特殊类型的数据库对象,用于将有关服务器和数据库事件的信息发送到 Service Broker 服务。
执行事件通知可对各种 Transact-SQL 数据定义语言 (DDL) 语句和 SQL 跟踪事件做出响应,采取的响应方式是将这些事件的相关信息发送到 Service Broker 服务。
事件通知可以用来执行以下操作:
记录和检索发生在数据库上的更改或活动。
执行操作以异步方式而不是同步方式响应事件。
可以将事件通知用作替代 DDL 触发器和 SQL 跟踪的编程方法。
事件通知在事务范围以外异步运行。因此,与 DDL 触发器不同,事件通知可以用于数据库应用程序中以响应事件而无需使用中间事务定义的任何资源。
与 SQL 跟踪不同,事件通知可用于在 SQL Server 实例内部执行操作以响应 SQL 跟踪事件。
创建事件通知时,将会在 SQL Server 实例和指定的目标服务之间打开一个或多个 Service Broker 会话。通常会话保持为打开状态,只要事件通知作为一个对象存在于服务器实例中。在某些出错情况下,会话可以在删除事件通知之前关闭。这些会话从不在事件通知之间共享。每个事件通知都有自己的排他会话。显式结束会话将阻止目标服务接收更多消息,下一次事件通知激发时,会话将不会重新打开。
事件信息作为 xml 类型变量传递给 Service Broker,提供了有关事件的发生时间、受影响的数据库对象、涉及的 Transact-SQL 批处理语句的信息以及其他信息。
与 SQL Server 一起运行的应用程序可以使用事件数据来跟踪进度并做出决策。
若要设计事件通知,必须确定下列内容:
通知的作用域。
引发事件通知的 Transact-SQL 语句或语句组。
定义通知作用域
您可以将事件通知指定为响应针对当前数据库中或 SQL Server 实例中的所有对象执行的语句。针对 QUEUE_ACTIVATION 和 BROKER_QUEUE_DISABLED 事件指定的事件通知的作用域限定为单个队列。并非所有事件都可以在任何作用域级别执行。例如,CREATE_DATABASE 事件仅可在服务器实例级执行。相反,针对 ALTER_TABLE 事件创建的事件通知可以通过编程,针对数据库中或服务器实例中的所有表执行。
指定Transact-SQL语句或语句组
可以创建事件通知以响应下面的内容:
特定 DDL 语句、SQL 跟踪事件或 Service Broker 事件
预定义的 DDL 语句组或 SQL 跟踪事件组
选择特定的 DDL 语句引发事件通知
事件通知可以设计为在运行特定的 Transact-SQL 语句或存储过程之后执行。如上面的示例中所示,事件通知在 ALTER_TABLE 事件之后执行。
有关可指定为引发事件通知的各个 Transact-SQL 语句以及可执行这些通知的作用域的列表,请参阅 DDL 事件。还可以通过查询 sys.event_notification_event_types 目录视图获取这些事件。
选择特定的 SQL 跟踪事件引发事件通知
事件通知可以设计为在 SQL 跟踪事件发生之后激发。
可以通过查询 sys.event_notification_event_types 目录视图获取这些事件的列表。SQL 跟踪事件仅可在服务器实例作用域级执行。
选择特定的 Service Broker 事件引发事件通知
事件通知可以设计为在 QUEUE_ACTIVATION 或 BROKER_QUEUE_DISABLED Service Broker 事件之后激发。当队列有消息要处理时,将发生 QUEUE_ACTIVATION 事件。当队列状态设置为 OFF 时,将发生 BROKER_QUEUE_DISABLED 事件。
选择预定义的 DDL 语句组引发事件通知
事件通知可以在任何属于预定义相似事件组的 Transact-SQL 事件运行之后执行。例如,如果要使事件通知在 CREATE TABLE、ALTER TABLE 或 DROP TABLE 语句执行之后执行,则可以在 CREATE EVENT NOTIFICATION 语句中指定 FOR DDL_TABLE_EVENTS。执行 CREATE EVENT NOTIFICATION 后,事件组将添加到 sys.events 目录视图中。
选择预定义的 SQL 跟踪事件组引发事件通知
事件通知可以在任何属于预定义相似跟踪事件组的 SQL 跟踪事件运行之后执行。例如,如果要使事件通知在任何与锁定相关的跟踪事件(包括 LOCK_DEADLOCK、LOCK_DEADLOCK_CHAIN、LOCK_ESCALATION 和 DEADLOCK_GRAPH 事件)之后执行,则可以在 CREATE EVENT NOTIFICATION 语句中指定 FOR TRC_LOCKS。
若要实现事件通知,必须先创建目标服务以接收事件通知,然后再创建事件通知。
创建目标服务
无需创建 Service Broker 启动服务,因为 Service Broker 包含以下特定的事件通知消息类型和约定:
http://schemas.microsoft.com/SQL/Notifications/PostEventNotification
接收事件通知的目标服务必须使用此预先存在的约定。
创建目标服务:
创建队列以接收消息。
在引用事件通知约定的队列上创建服务。
创建服务路由,以定义 Service Broker 将服务消息发送到的地址。对于指向同一数据库中的服务的事件通知,请指定 ADDRESS = ‘LOCAL‘。
创建事件通知
事件通知使用 Transact-SQL CREATE EVENT NOTIFICATION 语句创建,使用 DROP EVENT NOTIFICATION STATEMENT 删除。若要修改事件通知,必须先删除事件通知,然后再重新创建。
本文出自 “SQL Server Deep Dives” 博客,请务必保留此出处http://ultrasql.blog.51cto.com/9591438/1591452
原文地址:http://ultrasql.blog.51cto.com/9591438/1591452