事件通知

  • 一、背景知识
    • 1.1、事件通知的好处
    • 1.2、事件通知概念
    • 1.3、事件通知与触发器
  • 二、实现事件通知
    • 2.1、创建目标服务
    • 2.2、创建事件通知
  • 三、为事件通知配置对话安全性
  • 总结

一、背景知识

事件通知将有关事件的信息发送到服务代理服务。通过将有关这些事件的信息发送到服务代理服务,执行事件通知以响应各种事务处理 SQL 数据定义语言 (DDL) 语句和 SQL 跟踪事件。

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

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

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

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

1.1、事件通知的好处

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

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

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

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

1.2、事件通知概念

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

事件信息作为 xml 类型的变量传递到 Service Broker 服务,该变量提供有关事件发生时间、受影响的数据库对象、涉及的 Transact-SQL 批处理语句以及其他信息的信息。

1.3、事件通知与触发器

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

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

二、实现事件通知

若要实现事件通知,必须先创建接收事件通知的目标服务,然后创建事件通知。

2.1、创建目标服务

不必创建服务代理启动服务,因为服务代理包括以下事件通知的特定消息类型和协定:

https://schemas.microsoft.com/SQL/Notifications/PostEventNotification

接收事件通知的目标服务必须遵守此预先存在的协定。

要创建目标服务,请执行以下操作:

  1. 创建队列以接收消息。参考。
  2. 在队列上创建引用事件通知协定的服务。
  3. 在服务上创建路由以定义服务代理将服务消息发送到的地址。对于以同一数据库中的服务为目标的事件通知,请指定 ADDRESS = ‘LOCAL’ 。

示例:在队列上创建一个队列、一个服务,在服务上创建一个路由,以处理来自事件通知协定的消息。

CREATE QUEUE NotifyQueue ;  GO  CREATE SERVICE NotifyService  ON QUEUE NotifyQueue  (  [http://schemas.microsoft.com/SQL/Notifications/PostEventNotification]  );  GO  CREATE ROUTE NotifyRoute  WITH SERVICE_NAME = 'NotifyService',  ADDRESS = 'LOCAL';  GO

2.2、创建事件通知

事件通知是使用 Transact-SQL 创建事件通知语句创建的,并使用 DROP 事件通知语句删除。若要修改事件通知,必须删除并重新创建事件通知。

以下示例创建事件通知。此通知将有关服务器上发生的任何事件的消息发送到以前创建的服务。

CREATE EVENT NOTIFICATION CreateDatabaseNotification  ON SERVER  FOR CREATE_DATABASE  TO SERVICE 'NotifyService', '8140a771-3c4b-4479-8ac0-81008ab17984' ;

三、为事件通知配置对话安全性

应为将消息发送到远程服务器上的服务代理的事件通知配置服务代理对话框安全性。必须根据服务代理对话框完全安全模型手动配置对话框安全性。完全安全模型允许对发送到远程服务器和从远程服务器发送的消息进行加密和解密。尽管事件通知是在一个方向上发送的,但其他消息(如错误)也会以相反的方向返回。

以下步骤介绍了实现事件通知的对话安全性所需的过程。这些步骤包括要在源服务器和目标服务器上执行的操作。源服务器是在其上创建事件通知的服务器。目标服务器是接收事件通知消息的服务器。必须先完成源服务器和目标服务器的每个步骤中的操作,然后才能继续下一步。

  1. 步骤 1:建立 TCP 端口号和目标服务名称。建立源服务器和目标服务器将在其上接收消息的 TCP 端口。还必须确定目标服务的名称。
  2. 步骤 2:为数据库级身份验证配置加密和证书共享。
  3. 步骤 3:共享证书并授予数据库级身份验证的权限。
  4. 步骤 4:创建路由并设置服务器级身份验证。
  5. 步骤 5:共享用于服务器级身份验证的证书并创建事件通知。

步骤2在源服务器和目标服务器上完成以下操作:

步骤 3 在源服务器和目标服务器上完成以下操作:

步骤 4 在源服务器和目标服务器上完成以下操作:

步骤 5 在源服务器和目标服务器上完成以下操作:

总结

  1. 应为将消息发送到远程服务器上的服务代理的事件通知配置服务代理对话框安全性。必须根据完整安全模型手动配置对话框安全性。
  2. 服务代理路由确定接收通知消息的服务。如果事件通知以远程服务器上的服务为目标,则源服务器和目标服务器都必须在其上定义路由,以确保发生双向通信。