您好、欢迎来到现金彩票网!
当前位置:2019欢乐棋牌 > 主动数据库 >

SQL Server 事件通知(Event notifications)

发布时间:2019-07-27 06:39 来源:未知 编辑:admin

  SQL Server事件通知有什么用呢?如果你想监控SQL Server的DDL操作,你可以通过DDL触发器(参考:SQL Server DDL触发器运用),也可以通过SQL Server 事件通知把这个事件相关的信息发送到 Service Broker 服务;他们最大的区别就是DDL触发器可以进行ROLLBACK,而事件通知不行;还有,事件通知是异步发送消息的;

  SQL Server 事件通知还可以响应部分SQL跟踪事件,即SQL Trace (参考:SQL Server 默认跟踪(Default Trace)SQL Server 创建跟踪);他们最大的区别就是跟踪事件可以自定义生成哪些数据列,而事件通知是生成固定的XML;还有,每次重新启动服务器时,都必须重新启动跟踪。

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

  可以将事件通知用作替代 DDL 触发器和 SQL 跟踪的编程方法,因为你可以通过读取Service Broker 服务中的队列,在程序中对信息进行处理。

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

  下图是我对事件通知逻辑关系的理解,当数据库A或者实例B产生DDL就会激发事件通知,这个通知把相应的DDL的XML信息发送给队列,你可以通过SQL获取到队列中的XML;

  数据库的DDL操作默认会被记录到Default Trace默认跟踪中(参考:SQL Server 默认跟踪(Default Trace)),这是一个被动式的监控;而主动式的监控就可以使用DDL触发器(参考:SQL Server DDL触发器运用);我们还可以使用事件通知的形式监控DDL,下面就着重讲讲实现过程。

  执行Step7返回下图的结果,这是执行Step6脚本产生的两条DDL消息:

  通过下面的SQL脚本可以对Figure4所示的XML进行解释,保存到表中:

  上面Step9是使用游标的形式获取XML事件信息,下面Step11以RECEIVE方式获取XML事件信息,这种形式会把消息从队列中删除。

  关于使用事件通知监控SQL跟踪事件的文档我基本没有看到过,而且CSDN也没有相关的T-SQL示例,下面就演示实现过程:

  Step17可以通过Figure6所示的方式进行测试,执行Step18的SQL脚本返回Figure7信息,从内容看的确是监控到了用户登录的信息,同样我们可以通过Step19的SQL脚本查看错误日志的,效果是一样的。

  对比Figure7和Figure8的事件时间,可以看到事件先写入了错误日志中,再异步写入到事件通知的消息队列中;

  其它可以监控的SQL跟踪事件可以通过用于事件通知的跟踪事件进行查看,只有部分的SQL跟踪事件可用于事件通知,注意,不是所有。

  1. SERVER:将事件通知的作用域应用于 SQL Server 的当前实例。 如果已指定,则只要 FOR 子句中的指定事件在 SQL Server 的实例中发生,便会激发通知。

  2. DATABASE:将事件通知的作用域应用于当前数据库。 如果已指定,则只要 FOR 子句中的指定事件在当前数据库中发生,便会激发通知。

  4. 在获取队列数据的时候有两种方式,Select或Recieve(其中Recieve会删除队列中的事件消息);

  6. 无论是否回滚 DDL 语句,都将始终生成 DDL 生成的跟踪事件。如果回滚相应 DDL 语句中的事件,则事件通知不会触发。

  1. “SQL 跟踪不会对与事务关联的性能造成负面影响。打包数据很有效。创建 XML 格式的事件数据和发送事件通知会对性能造成关联的负面影响。“这句需要怎么理解?

  3. 触发器必须在本地服务器上处理,事件通知可以在远程服务器上处理?如何实现?什么场景下可以使用?

  4. 事件通知的SQL跟踪只能设置SERVER级别?不能设置DATABASE级别的?如果设置了DATABASE级别会报下面的错误信息:

  解答:SQL 跟踪事件只能运行于服务器级 (ON SERVER)(依据:用于事件通知的跟踪事件)

  5. 为什么一次登陆会造成两条登陆信息的呢?下面的SQL语句会造成一次用户登陆,因为需要读取文件?

  6. 队列是存储在什么地方?以什么的形式存储的?存储怎么保证消息的安全性(数据库宕机或者数据丢失等情况)?

http://windowsquebec.com/zhudongshujuku/233.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有