原文:使用SQLServer Audit来监控触发器的启用、禁用情况

使用情景:

有时候会发现在触发器中的业务逻辑没有执行,可能是因为触发器的逻辑错误所引起的。但是有时候却是因为一些触发器被禁用了。

由于SQLServer默认不跟踪触发器的启用还是禁用。且禁用触发器的命令(Disable Trigger)不在默认跟踪里面捕获。但是可以在服务器级别的跟踪(不是使用Profiler)获取这些信息,捕获SQL:StmtCompleted并在TextData列筛选,但是对于负载较重的系统,这样会有比较大的影响。

如果你的是企业版,可以考虑使用一个新特性:SQL Server Audit。可以使用DATABASE AUDIT SPECIFICATION来捕获这些事件。

使用步骤:

第一步,使用以下语句先创建服务器级别监控:

USE master;

GO

CREATE SERVER AUDIT ServerAudit

  TO FILE (FILEPATH = 'E:\temp\', MAXSIZE = 1 GB)--注意更改文件路径

  WITH (ON_FAILURE = CONTINUE);

GO

ALTER SERVER AUDIT ServerAudit

  WITH (STATE = ON);

注意,路径需要修改,temp文件夹也要实现开启。

第二步,创建数据库级别监控:

对于本文,我们关注SCHEMA_OBJECT_CHANGE_GROUP,以AdventureWorks为例子:

USE AdventureWorks;
GO
CREATE DATABASE AUDIT SPECIFICATION schema_change
FOR SERVER AUDIT ServerAudit
ADD (SCHEMA_OBJECT_CHANGE_GROUP)
WITH (STATE = ON);
GO

第三步,创建一个示例表,然后创建一个示例触发器:

CREATE TABLE dbo.splunge ( id INT ) ;
GO
CREATE TRIGGER dbo.splunge_trigger ON dbo.splunge
FOR INSERT
AS
BEGIN
SELECT 1 ;
END
GO

第四步,可以使用以下脚本来检查:

SELECT  event_time ,
succeeded ,
server_principal_name ,
[object_name] ,
[statement]
FROM sys.fn_get_audit_file('E:\Temp\ServerAudit*', NULL, NULL)
WHERE database_name = 'AdventureWorks' ;

结果如下,可以看到捕获了创建的记录:

现在来禁用这个触发器,然后再查询一下:

DISABLE TRIGGER dbo.splunge_trigger ON dbo.splunge;
GO
SELECT event_time ,
succeeded ,
server_principal_name ,
[object_name] ,
[statement]
FROM sys.fn_get_audit_file('E:\Temp\ServerAudit*', NULL, NULL)
WHERE database_name = 'AdventureWorks' ;

结果如下:

如果你重新启用这个触发器,你会再看到另外一行,如果觉得返回数据太多,可以在where语句中添加筛选:

AND [statement] LIKE '%disable%trigger%'

但是有时候会存在误报,比如,在你的代码里面可能存在同样的信息。但是筛选数据对性能和检查问题总是有好处的。

小结:

捕获事件有很多种方式。此功能仅限2008企业版使用。

使用SQLServer Audit来监控触发器的启用、禁用情况的更多相关文章

  1. SQL Server Audit监控触发器状态

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 注意事项(Attention) 疑问(Questions) 参 ...

  2. 对SQLSERVER进行性能监控

    对SQLSERVER进行性能监控 在上一篇文章<SQLSERVER性能监控级别步骤>里说到性能监控的步骤中有一步涉及到建立性能基线,但是没有说到有哪些计数器 可以用来进行监控的,这篇文章结 ...

  3. Sqlserver中存储过程,触发器,自定义函数(二)

    Sqlserver中存储过程,触发器,自定义函数: 自定义函数:1.函数类型:2.函数的参数和返回值: 1.函数类型:标量值函数,返回的是一个标量值表值函数:内联表值函数:多语句表值函数. 标量值函数 ...

  4. Sqlserver中存储过程,触发器,自定义函数(一)

    Sqlserver中存储过程,触发器,自定义函数 1.存储过程有关内容存储过程的定义:存储过程的分类:存储过程的创建,修改,执行:存储过程中参数的传递,返回与接收:存储过程的返回值:存储过程使用游标. ...

  5. Sqlserver中存储过程,触发器,自定义函数

    Sqlserver中存储过程,触发器,自定义函数: 1. 触发器:是针对数据库表或数据库的特殊存储过程,在某些行为发生的时候就会被激活 触发器的分类: DML触发器:发生在数据操作语言执行时触发执行的 ...

  6. 设置 sqlserver Profiler 只监控 EF的sql执行请求

    当我们用EF执行语句的时候,可以使用 sqlserver Profiler来监控到底执行了哪些sql语句,但是默认他是监控全局的,我们只想监控Ef的语句,这里如下设置 这样就只会监控 EF产生的 sq ...

  7. Oracle plsql 触发器 查询/启用/停止

    在PLSQL中查询某个表的触发器脚本 select * from user_triggers where table_name='xxx' oracle触发器的启用和停用 1.禁用 table_nam ...

  8. 利用win服务定时为网卡启用/禁用

    上周,Boss和我说,他儿子夜里爬起来用笔记本在被窝里玩CF,问路由器可以解决么,我看了是TPLINK的普通家用无线路由器,不支持禁用CF客户端网游,可以通过配置端口屏蔽什么的,但是白天又要开启,想想 ...

  9. 在 Windows服务器中启用/禁用SMBv1、SMBv2和SMBv3的方法

    本文介绍如何在 SMB 客户端和服务器组件上启用/禁用服务器消息块 SMBv1.SMBv2 和 SMBv3. 注意:建议由专业技术工程师完成以下操作. 禁用 SMBv2 和 SMBv3 的影响 我们建 ...

随机推荐

  1. hdu 动态规划(46道题目)倾情奉献~ 【只提供思路与状态转移方程】(转)

    HDU 动态规划(46道题目)倾情奉献~ [只提供思路与状态转移方程] Robberies http://acm.hdu.edu.cn/showproblem.php?pid=2955      背包 ...

  2. 不用Root权限获取已经安装的Apk安装包

    在安卓设备上安装的apk都会被保留一份在/data/app目录下,但是该目录对于普通用户来说只有可执行权限,是无法访问的. 但是其子文件具有可读权限. 意思也就说我们直接去查看/data/app这个目 ...

  3. 正則表達式 取出img标签 保存于指定路径

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  4. VS解决BEX错误但不能关闭DEP保存

    报道近期计划BEX错误: 问题签名: 问题事件名称: BEX 应用程序名: Auth.exe 应用程序版本号: 0.0.0.0 应用程序时间戳: 546d9e0c 故障模块名称: Auth.exe 故 ...

  5. shell编程三大神器之awk

  6. 【C语言探险】 第四课的第二部分:串

    内容简单介绍 1.课程大纲 2.第二部分第四课: 字符串 3.第二部分第五课预告: 预处理 课程大纲 我们的课程分为四大部分,每个部分结束后都会有练习题,并会发布答案.还会带大家用C语言编写三个游戏. ...

  7. Linux日志清除

    因为数据要求.经常需要抓住和筛选过滤数据,大概花了7 8个月.改变了机旁数据.重新开始,发现"No space left on device" 解决方法: 直接删除日志(简单粗暴) ...

  8. HTML contact form with CAPTCHA

    http://www.html-form-guide.com/contact-form/html-contact-form-captcha.html#codedownload

  9. Debug with Eclipse

    In this post we are going to see how to develop applications using Eclipse and Portofino 4. The trad ...

  10. android手机SD卡中的android_secure目录

    .android_secure 是官方app2sd的产物,删了之后装到sd卡中的软件就无法使用了.里面有非常多.asec的文件,都是装到SD卡上的软件,可是一般装到sd卡中的程序被卸载了.androi ...