事件通知(Event Notification)介绍

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介:

了解事件通知



事件通知是特殊类型的数据库对象,用于将有关服务器和数据库事件的信息发送到 Service Broker 服务。

 

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

 

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

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

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

clip_image001

 

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

 

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

 

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

 

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

 

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

 

与 SQL Server 一起运行的应用程序可以使用事件数据来跟踪进度并做出决策。

 


设计事件通知



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

    通知的作用域。

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

 

定义通知作用域

 

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

 

指定Transact-SQL语句或语句组

 

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

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

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

 

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

 

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

 

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

 

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

 

事件通知可以设计为在 SQL 跟踪事件发生之后激发。

可以通过查询 sys.event_notification_event_types 目录视图获取这些事件的列表。SQL 跟踪事件仅可在服务器实例作用域级执行。

 

选择特定的 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 跟踪事件组引发事件通知


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

 


实现事件通知

 

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

 

创建目标服务

 

无需创建 Service Broker 启动服务,因为 Service Broker 包含以下特定的事件通知消息类型和约定:

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

 

接收事件通知的目标服务必须使用此预先存在的约定。

 

创建目标服务:

    创建队列以接收消息。

    在引用事件通知约定的队列上创建服务。

    创建服务路由,以定义 Service Broker 将服务消息发送到的地址。对于指向同一数据库中的服务的事件通知,请指定 ADDRESS = 'LOCAL'。

 

创建事件通知

 

事件通知使用 Transact-SQL CREATE EVENT NOTIFICATION 语句创建,使用 DROP EVENT NOTIFICATION STATEMENT 删除。若要修改事件通知,必须先删除事件通知,然后再重新创建。



















本文转自UltraSQL51CTO博客,原文链接: http://blog.51cto.com/ultrasql/1591452,如需转载请自行联系原作者




相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
存储 Cloud Native 程序员
C++ Qt 事件(event)
C++ Qt 事件(event)
|
5月前
|
UED
event事件
event事件
39 1
|
6月前
|
存储 Java Linux
Android系统获取event事件回调等几种实现和原理分析
Android系统获取event事件回调等几种实现和原理分析
346 0
|
API Android开发
Notification(状态栏通知)详解
Android中用于在状态栏显示通知信息的控件:Notification,相信大部分学Android都对他都很熟悉,而网上很多关于Notification的使用教程都是基于2.x的,而现在普遍的Android设备基本都在4.x以上,甚至是5.0以上的都有;他们各自的Notification都是不一样的!而本节给大家讲解的是基于4.x以上的Notification。
219 0
|
大数据 开发者
Watcher 介绍&通知状态事件类型|学习笔记
快速学习 Watcher 介绍&通知状态事件类型
110 0
|
Android开发
通知(Notification)
创建通知之前需要对android版本进行一个判断 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) 1 activity_main.xml代码里仅有一个Button用于响应通知,代码不再展示
263 0
通知(Notification)
|
C#
C# 事件(Event)
C# 事件(Event) 事件(Event) 基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些提示信息,如系统生成的通知。应用程序需要在事件发生时响应事件。例如,中断。 C# 中使用事件机制实现线程间的通信
178 0
|
消息中间件 监控 Kafka
【kafka源码】/log_dir_event_notification的LogDir脱机事件通知
【kafka源码】/log_dir_event_notification的LogDir脱机事件通知
【kafka源码】/log_dir_event_notification的LogDir脱机事件通知
|
C++
C++ 事件(event)使用总结
C++ 事件(event)使用总结
1407 0
C++ 事件(event)使用总结
|
容器 C# 安全
事件(Event)
事件(Event) 事件是对象发送的消息,以发信号通知操作的发生。操作可能是由用户交互(例如鼠标单击)引起的,也可能是由某些其他的程序逻辑触发的。引发事件的对象称为事件发送方。捕获事件并对其作出响应的对象叫做事件接收方。
749 1