zoukankan      html  css  js  c++  java
  • 使用SQLServer Audit来监控触发器的启用、禁用情况(转载)

     使用情景:      

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

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

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

    使用步骤:

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

    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;
    
    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为例子:

    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;
    GO
    CREATE DATABASE AUDIT SPECIFICATION schema_change
    FOR SERVER AUDIT ServerAudit
    ADD (SCHEMA_OBJECT_CHANGE_GROUP)
    WITH (STATE = ON);
    GO
    


     

     

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

    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 ) ;
    GO
    CREATE TRIGGER dbo.splunge_trigger ON dbo.splunge
        FOR INSERT
    AS
        BEGIN
            SELECT  1 ;
        END
    GO
    


     

     

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

    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' ;
    


     

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

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

     

    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;
    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语句中添加筛选:

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

     

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

     

    小结:

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

  • 相关阅读:
    各种排序
    最大子数组的和与积
    字符串距离
    二叉树的基本操作
    C++11创建线程的几种方式
    二分查找
    汉诺塔问题
    读写锁实现
    全排列
    数字转汉字
  • 原文地址:https://www.cnblogs.com/qanholas/p/2802584.html
Copyright © 2011-2022 走看看