您好,欢迎访问一九零五行业门户网

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

使用情景: 有时候会发现在触发器中的业务逻辑没有执行,可能是因为触发器的逻辑错误所引起的。但是有时候却是因为一些触发器被禁用了。 由于 sqlserver 默认不跟踪触发器的启用还是禁用。且禁用触发器的命令( disable trigger )不在默认跟踪里面捕获。但
 使用情景:             有时候会发现在触发器中的业务逻辑没有执行,可能是因为触发器的逻辑错误所引起的。但是有时候却是因为一些触发器被禁用了。
由于sqlserver默认不跟踪触发器的启用还是禁用。且禁用触发器的命令(disable trigger)不在默认跟踪里面捕获。但是可以在服务器级别的跟踪(不是使用profiler)获取这些信息,捕获sql:stmtcompleted并在textdata列筛选,但是对于负载较重的系统,这样会有比较大的影响。
如果你的是企业版,可以考虑使用一个新特性:sql server audit。可以使用database audit specification来捕获这些事件。
使用步骤: 
第一步,使用以下语句先创建服务器级别监控: 
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为例子:
use adventureworks;gocreate database audit specification schema_changefor server audit serverauditadd (schema_object_change_group)with (state = on);go
第三步,创建一个示例表,然后创建一个示例触发器: 
create table dbo.splunge ( id int ) ;gocreate trigger dbo.splunge_trigger on dbo.splunge for insertas begin select 1 ; endgo
第四步,可以使用以下脚本来检查: 
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;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语句中添加筛选:
and [statement] like '%disable%trigger%'
但是有时候会存在误报,比如,在你的代码里面可能存在同样的信息。但是筛选数据对性能和检查问题总是有好处的。
小结:        捕获事件有很多种方式。此功能仅限2008企业版使用。
其它类似信息

推荐信息