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

原文:使用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企业版使用。

时间: 2024-10-06 10:34:21

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

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

Sqlserver中存储过程,触发器,自定义函数 1.存储过程有关内容存储过程的定义:存储过程的分类:存储过程的创建,修改,执行:存储过程中参数的传递,返回与接收:存储过程的返回值:存储过程使用游标. 1.1存储过程的定义:存放在服务器上预先编译好的sql语句,可以给存储过程传递参数,也可以从存储过程返回值. 优点:提供了安全访问机制,比如可以将不同的存储过程的执行权限赋予权限不同的用户:改进了执行性能,因为存储过程是预编译的:减少了网络流量,因为在调用存储过程时,传递的字符串很短,没有很长的s

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

Sqlserver中存储过程,触发器,自定义函数: 自定义函数:1.函数类型:2.函数的参数和返回值: 1.函数类型:标量值函数,返回的是一个标量值表值函数:内联表值函数:多语句表值函数. 标量值函数: 1 go 2 create function SumOrders(@职工号 varchar(20))--指定参数名,和返回类型 stuNo 3 returns int --指定返回类型 4 begin 5 declare @订单总数 int --学生人数sumstudent 6 select @

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

Sqlserver中存储过程,触发器,自定义函数: 1. 触发器:是针对数据库表或数据库的特殊存储过程,在某些行为发生的时候就会被激活 触发器的分类: DML触发器:发生在数据操作语言执行时触发执行的存储过程,Insert,Update,Delete After触发器:记录被改变之后激活执行 Instead of触发器:记录被改变之前激活执行. DDL触发器:响应数据定义语言执行时触发执行的存储过程,一般用于执行数据库中的管理任务 审核和规范数据库的操作: 防止数据表结构被更改或删除 2. ht

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

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

对SQLSERVER进行性能监控

对SQLSERVER进行性能监控 在上一篇文章<SQLSERVER性能监控级别步骤>里说到性能监控的步骤中有一步涉及到建立性能基线,但是没有说到有哪些计数器 可以用来进行监控的,这篇文章结合<企业级平台管理实践>的书本说一下监控SQLSERVER有哪些计数器可以用到的 3.建立性能基线    当确定了性能监控中所涉及的资源.负载和目标后,开始进行监控,并建立性能基线与当前服务器性能进行比较.   性能基线是一个保证系统正常操作性能范围值,达到或超过这个范围,系统性能可能会显著下降.

启用禁用外网

接着上次的小工具启用禁用外网,也不是什么高技术含量的,拿来用就行了,所以这里就不多说明,代码里有简单介绍 启用禁用外网方法 public bool ForbiddenNetWork(bool isForbidden) { try { //禁用dns if (isForbidden) { //如果双网卡:114.114.114.114|115.115.115.115|116.116.116.116 8.8.8.8 List<string[]> getDNSList = NetWorkSettin

charles 启用/禁用断点

本文参考:charles 启用/禁用断点 1.3. enable/disable breakpoints 和 2.3 breakpoints settings 断点设置是常用的了,没啥好说的了,可以设置你需要断点的域名等: 这个类似我们写代码设置断点一样: 加载文件等步骤并不会直接完成,而是切割成一步一步的, 然后你需要手动让程序进入下一步,程序才会继续往前走: 否则就会一直卡在某一个步骤不走了: 好吧,说的很玄乎,,只要你是写过代码的,,你应该明白我想表达的意思:: - -... 本文参考:h

SQLServer:镜像监控之oldest unsent transaction告警自愈

本文将介绍sqlserver镜像监控中出现Oldest Unsent Transaction Threshold告警如何自愈 镜像监控的数据及告警由Database Mirroring Monitor Job作业进行记录及触发,当Oldest Unsent Transaction超过Threshold时,触发代码为32040的错误信息. 告警的出现可能跟主体服务器实例和镜像服务器实例中的负载及它们的网络连接相关(博主在维护中遇到的情况大多是这样),但是在负载或网络连接恢复正常后,Oldest U

sql-server数据库中利用触发器实现表与表之间的级联删除

create trigger Delete_Student --创建一个触发器 on student instead of delete as declare @sno varchar(20) select @sno= sno from deleted delete from score where sno=@sno delete from student where sno=@sno go delete from Student where Sno='101' select *from Stu