• 使用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企业版使用。

  • 相关阅读:
    题解 P2168 【[NOI2015]荷马史诗】
    题解 P2607 【[ZJOI2008]骑士】
    题解 P4323 【[JSOI2016]独特的树叶】
    题解 P4074 【[WC2013]糖果公园】
    题解 P4552 【[Poetize6] IncDec Sequence】
    题解 P3469 【[POI2008]BLO-Blockade】
    题解 P5058 【[ZJOI2004]嗅探器】
    题解 P4767 【[IOI2000]邮局】
    题解 CF463D 【Gargari and Permutations】
    TensorFlow学习笔记之二——安装和运行
  • 原文地址:https://www.cnblogs.com/qanholas/p/2802584.html
Copyright © 2020-2023  润新知