事件通知

事件通知将有关事件的信息发送到 Service Broker 服务。 事件通知通过向 Service Broker 服务发送有关这些事件的信息,以响应各种 Transact-SQL 数据定义语言(DDL)语句和 SQL 跟踪事件。

事件通知可用于执行以下工作:

  • 记录和查看数据库上发生的更改或活动。

  • 用异步方式响应事件,而不是同步方式。

事件通知可以提供 DDL 触发器和 SQL 跟踪的编程替代方法。

事件通知的好处

事件通知以异步方式在事务范围之外运行。 因此,与 DDL 触发器不同,可以在数据库应用程序中使用事件通知来响应事件,而无需使用即时事务定义的任何资源。

与 SQL 跟踪不同,事件通知可用于在 SQL Server 实例内执行作,以响应 SQL 跟踪事件。

与 SQL Server 一起运行的应用程序可以使用事件数据来跟踪进度和做出决策。 例如,以下事件通知将在 AdventureWorks2012 示例数据库中每次发出 ALTER TABLE 语句时,向特定服务发送通知。

USE AdventureWorks2012;  
GO  
CREATE EVENT NOTIFICATION NotifyALTER_T1  
ON DATABASE  
FOR ALTER_TABLE  
TO SERVICE '//Adventure-Works.com/ArchiveService' ,  
    '8140a771-3c4b-4479-8ac0-81008ab17984';  

事件通知概念

创建事件通知时,将打开 SQL Server 实例与指定的目标服务之间的一个或多个 Service Broker 对话。 只要事件通知作为服务器实例上的对象存在,对话通常会保持打开状态。 在某些情况下,对话可以在删除事件通知之前关闭。 这些对话永远不会在事件通知之间共享。 每个事件通知都有自己的专属会话。 结束会话会显式阻止目标服务接收更多消息,并且下次触发事件通知时,会话将不会重新打开。

事件信息作为类型的 xml 变量传递到 Service Broker 服务,该变量提供有关事件发生的时间、有关数据库对象受影响的数据库对象、涉及 Transact-SQL 批处理语句和其他信息的信息。 有关事件通知生成的 XML 架构的详细信息,请参阅 EVENTDATA (Transact-SQL)

事件通知与触发器

下表比较和对比触发器和事件通知。

触发器 事件通知
DML 触发器响应数据操作语言(DML)事件。 DDL 触发器响应数据定义语言 (DDL) 事件。 事件通知会对 DDL 事件和一部分 SQL 跟踪事件作出响应。
触发器可以运行 Transact-SQL 或公共语言运行时(CLR)托管代码。 事件通知不运行代码。 而是将消息发送到 xml Service Broker 服务。
触发器在导致触发的事务范围内同步处理。 事件通知可以异步处理,并且不会在导致触发事件的事务范围内运行。
触发器的使用者与引发触发器的事件紧密耦合。 事件通知的使用者与导致事件触发的事件分离。
必须在本地服务器上处理触发器。 可以在远程服务器上处理事件通知。
可以回滚触发器。 无法回滚事件通知。
DML 触发器名称是以架构为范围的。 DDL 触发器名称是数据库作用域或服务器作用域的。 事件通知名称由服务器或数据库限定。 QUEUE_ACTIVATION事件的事件通知的范围限定为特定队列。
DML 触发器由应用它们的表所在的同一所有者拥有。 队列上事件通知的所有者可能具有与应用事件通知的对象不同的所有者。
触发器支持 EXECUTE AS 子句。 事件通知不支持 EXECUTE AS 子句。
可以使用返回数据类型的 EVENTDATA 函数 xml 捕获 DDL 触发器事件信息。 事件通知将事件信息发送到 xml Service Broker 服务。 信息的格式设置为与 EVENTDATA 函数相同的架构。
有关触发器的元数据位于 sys.triggerssys.server_triggers 目录视图中。 有关事件通知的元数据位于 sys.event_notificationssys.server_event_notifications 目录视图中。

事件通知 与 SQL 跟踪

下表使用事件通知和 SQL 跟踪来比较和对比监视服务器事件。

SQL 跟踪 事件通知
SQL 跟踪不会导致任何与事务相关的性能开销。 打包数据非常高效。 创建 XML 格式的事件数据和发送事件通知会产生性能开销。
SQL 跟踪可以监视任何跟踪事件类。 事件通知可以监视跟踪事件类的子集以及所有数据定义语言(DDL)事件。
可以自定义要在跟踪事件中生成的数据列。 已修复事件通知返回的 XML 格式事件数据的架构。
由 DDL 生成的跟踪事件始终会生成,无论 DDL 语句是否被回滚。 如果相应的 DDL 语句中的事件被回滚,则事件通知不会触发。
管理跟踪事件数据的中间流涉及填充和管理跟踪文件或跟踪表。 通过 Service Broker 队列自动完成事件通知数据的中间管理。
每次服务器重启时都必须重启跟踪。 注册后,事件通知会在服务器周期之间持续存在,并进行事务处理。
启动后,无法控制跟踪过程的触发。 停止时间和筛选时间可用于指定启动时间。 通过轮询相应的跟踪文件来访问跟踪记录。 事件通知可以通过使用 WAITFOR 语句对生成的消息队列进行控制。 可以通过轮询队列来访问这些数据。
ALTER TRACE 是创建跟踪所需的最低权限。 还需要权限才能在相应的计算机上创建跟踪文件。 最小权限取决于正在创建的事件通知的类型。 相应队列也需要 RECEIVE 权限。
可以远程接收踪迹。 可以远程接收事件通知。
跟踪事件是使用系统存储过程实现的。 事件通知通过使用数据库引擎和服务 BrokerTransact-SQL 语句的组合来实现。
可以通过查询相应的跟踪表、分析跟踪文件或使用 SQL Server 管理对象 (SMO) TraceReader 类以编程方式访问跟踪事件数据。 可以通过针对 XML 格式化事件数据执行 XQuery 或使用 SMO 事件类,以编程方式访问事件数据。

事件通知任务

任务 主题
介绍如何创建和实现事件通知。 实现事件通知
介绍如何为将消息发送到远程服务器上的 Service Broker 的事件通知配置 Service Broker 对话框安全性。 为事件通知配置对话框安全性
介绍如何返回有关事件通知的信息。 获取有关事件通知的信息

另请参阅

DDL 触发器
DML 触发器
SQL 跟踪