设计事件通知
若要设计事件通知,必须确定下列内容:
通知的作用域。
引发事件通知的 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 跟踪事件组的列表,请参阅事件通知使用的跟踪事件组。这些组只能在服务器实例级执行。