博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用SQLServer Audit来监控触发器的启用、禁用情况(转载)
阅读量:6281 次
发布时间:2019-06-22

本文共 2640 字,大约阅读时间需要 8 分钟。

 使用情景:      

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

 

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

 

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

 

使用步骤:

 

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

 

[sql]
  1. USE master;  
  2.   
  3. GO  
  4.   
  5. CREATE SERVER AUDIT ServerAudit  
  6.   
  7.   TO FILE (FILEPATH = 'E:\temp\', MAXSIZE = 1 GB)--注意更改文件路径   
  8.   
  9.   WITH (ON_FAILURE = CONTINUE);  
  10.   
  11. GO  
  12.   
  13. ALTER SERVER AUDIT ServerAudit  
  14.   
  15.   WITH (STATE = ON);  
USE master;GOCREATE SERVER AUDIT ServerAudit  TO FILE (FILEPATH = 'E:\temp\', MAXSIZE = 1 GB)--注意更改文件路径  WITH (ON_FAILURE = CONTINUE);GOALTER SERVER AUDIT ServerAudit  WITH (STATE = ON);

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

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

 

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

[sql]
  1. USE AdventureWorks;  
  2. GO  
  3. CREATE DATABASE AUDIT SPECIFICATION schema_change  
  4. FOR SERVER AUDIT ServerAudit  
  5. ADD (SCHEMA_OBJECT_CHANGE_GROUP)  
  6. WITH (STATE = ON);  
  7. GO  
USE AdventureWorks;GOCREATE DATABASE AUDIT SPECIFICATION schema_changeFOR SERVER AUDIT ServerAuditADD (SCHEMA_OBJECT_CHANGE_GROUP)WITH (STATE = ON);GO

 

 

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

 

[sql]
  1. CREATE TABLE dbo.splunge ( id INT ) ;  
  2. GO  
  3. CREATE TRIGGER dbo.splunge_trigger ON dbo.splunge  
  4.     FOR INSERT  
  5. AS  
  6.     BEGIN  
  7.         SELECT  1 ;  
  8.     END  
  9. GO  
CREATE TABLE dbo.splunge ( id INT ) ;GOCREATE TRIGGER dbo.splunge_trigger ON dbo.splunge    FOR INSERTAS    BEGIN        SELECT  1 ;    ENDGO

 

 

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

 

[sql]
  1. SELECT  event_time ,  
  2.         succeeded ,  
  3.         server_principal_name ,  
  4.         [object_name] ,  
  5.         [statement]  
  6. FROM    sys.fn_get_audit_file('E:\Temp\ServerAudit*'NULLNULL)  
  7. WHERE   database_name = 'AdventureWorks' ;  
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' ;

 

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

 

 

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

 

 

[sql]
  1. DISABLE TRIGGER dbo.splunge_trigger ON dbo.splunge;  
  2. GO  
  3. SELECT  event_time ,  
  4.         succeeded ,  
  5.         server_principal_name ,  
  6.         [object_name] ,  
  7.         [statement]  
  8. FROM    sys.fn_get_audit_file('E:\Temp\ServerAudit*'NULLNULL)  
  9. WHERE   database_name = 'AdventureWorks' ;  
DISABLE TRIGGER dbo.splunge_trigger ON dbo.splunge;GOSELECT  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语句中添加筛选:

[sql]
  1. AND [statement] LIKE '%disable%trigger%'  
AND [statement] LIKE '%disable%trigger%'

 

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

 

小结:

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

转载地址:http://vzxva.baihongyu.com/

你可能感兴趣的文章
docker centos环境部署tomcat
查看>>
JavaScript 基础(九): 条件 语句
查看>>
Linux系统固定IP配置
查看>>
配置Quartz
查看>>
Linux 线程实现机制分析
查看>>
继承自ActionBarActivity的activity的activity theme问题
查看>>
设计模式01:简单工厂模式
查看>>
项目经理笔记一
查看>>
Hibernate一对一外键双向关联
查看>>
mac pro 入手,php环境配置总结
查看>>
MyBatis-Plus | 最简单的查询操作教程(Lambda)
查看>>
rpmfusion 的国内大学 NEU 源配置
查看>>
spring jpa 配置详解
查看>>
IOE,为什么去IOE?
查看>>
java 用反射简单应用,将Object简单转换成map
查看>>
Storm中的Worker
查看>>
dangdang.ddframe.job中页面修改表达式后进行检查
查看>>
Web基础架构:负载均衡和LVS
查看>>
Linux下c/c++相对路径动态库的生成与使用
查看>>
SHELL实现跳板机,只允许用户执行少量允许的命令
查看>>