设计事件通知

若要设计事件通知,必须确定下列内容:

  • 通知的作用域。

  • 引发事件通知的 Transact-SQL 语句或语句组。

注意注意

事件通知不会响应可影响局部或全局临时表以及存储过程的事件。

定义通知作用域

您可以将事件通知指定为响应针对当前数据库中或 SQL Server 实例中的所有对象执行的语句。针对 QUEUE_ACTIVATION 和 BROKER_QUEUE_DISABLED 事件指定的事件通知的作用域限定为单个队列。并非所有事件都可以在任何作用域级别执行。例如,CREATE_DATABASE 事件仅可在服务器实例级执行。相反,针对 ALTER_TABLE 事件创建的事件通知可以通过编程,针对数据库中或服务器实例中的所有表执行。

下面的示例将服务器实例中运行的任意 ALTER TABLE 语句的通知发送到 Service Broker 实例的当前数据库中。

CREATE EVENT NOTIFICATION log_ddl1 
   ON SERVER 
   FOR ALTER_TABLE 
   TO SERVICE '//Adventure-Works.com/ArchiveService' , 'current database';

下面的“选择特定的 DDL 语句引发事件通知”部分中提供了指向 Transact-SQL 语句以及可以为这些语句指定的作用域的链接。

指定 Transact-SQL 语句或语句组

可以创建事件通知以响应下面的内容:

  • 特定 DDL 语句、SQL 跟踪事件或 Service Broker 事件

  • 预定义的 DDL 语句组或 SQL 跟踪事件组

选择特定的 DDL 语句引发事件通知

事件通知可以设计为在运行特定的 Transact-SQL 语句或存储过程之后执行。如上面的示例中所示,事件通知在 ALTER_TABLE 事件之后执行。

有关可指定为引发事件通知的各个 Transact-SQL 语句以及可执行这些通知的作用域的列表,请参阅 DDL 事件。还可以通过查询 sys.event_notification_event_types 目录视图获取这些事件。

注意注意

执行 DDL 式操作的系统存储过程也可以激发事件通知。测试您的事件通知以确定它们是否响应运行的系统存储过程。例如,CREATE TYPE 语句和 sp_addtype 存储过程都将激发针对 CREATE_TYPE 事件创建的事件通知。

选择特定的 SQL 跟踪事件引发事件通知

事件通知可以设计为在 SQL 跟踪事件发生之后激发。例如,下面的事件通知在服务器中出现 Object_Created 事件之后才激发。

CREATE EVENT NOTIFICATION log_ddl1 
   ON SERVER 
   FOR Object_Created 
   TO SERVICE '//Adventure-Works.com/ArchiveService', 'current database' ;

有关可引发事件通知的 SQL 跟踪事件的列表,请参阅用于事件通知的跟踪事件。还可以通过查询 sys.event_notification_event_types 目录视图获取这些事件的列表。SQL 跟踪事件仅可在服务器实例作用域级执行。有关 SQL 跟踪事件类的详细信息,请参阅 SQL Server Profiler 参考

选择特定的 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 Server 2005 中,sys.events 通过仅列出组所涵盖的各个事件来扩展事件组。因此,在 SQL Server 2008 中对事件组涵盖的事件的更改并不适用于在 SQL Server 2005 中对那些事件组创建的事件通知。

有关可用于事件通知的预定义 DDL 和 DML 语句组、它们所包含的特定语句以及可执行这些事件组的作用域的列表,请参阅 DDL 事件组

选择预定义的 SQL 跟踪事件组引发事件通知

事件通知可以在任何属于预定义相似跟踪事件组的 SQL 跟踪事件运行之后执行。例如,如果要使事件通知在任何与锁定相关的跟踪事件(包括 LOCK_DEADLOCK、LOCK_DEADLOCK_CHAIN、LOCK_ESCALATION 和 DEADLOCK_GRAPH 事件)之后执行,则可以在 CREATE EVENT NOTIFICATION 语句中指定 FOR TRC_LOCKS。

有关可用于事件通知的预定义 SQL 跟踪事件组的列表,请参阅事件通知使用的跟踪事件组。这些组只能在服务器实例级执行。