了解事件通知

执行事件通知可对各种 Transact-SQL 数据定义语言 (DDL) 语句和 SQL 跟踪事件做出响应,采取的响应方式是将这些事件的相关信息发送到 Service Broker 服务。

事件通知可以用来执行以下操作:

  • 记录和检索发生在数据库上的更改或活动。

  • 执行操作以异步方式而不是同步方式响应事件。

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

事件通知在事务范围以外异步运行。因此,与 DDL 触发器不同,事件通知可以用于数据库应用程序中以响应事件而无需使用中间事务定义的任何资源。有关详细信息,请参阅了解事件通知与触发器

与 SQL 跟踪不同,事件通知可用于在 SQL Server 实例内部执行操作以响应 SQL 跟踪事件。有关详细信息,请参阅了解事件通知与 SQL 跟踪

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

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

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

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

SQL Server 数据库引擎示例中提供了可对 AdventureWorks2008R2 示例数据库运行的事件通知示例脚本 EventNotificationSample.sql。