SQL Server Audit监控触发器状态
一.本文所涉及的内容(Contents)
二.背景(Contexts)
DML触发器一般会运用在业务系统的逻辑处理上,在你对数据库用户权限控制不当的时候,这些DML触发器很可能莫名的被禁用或者删除了,你作为数据库管理员你想做冤大头嘛?背黑锅嘛?如果不想,下面给出4种解决方案:
1. 使用DDL触发器对服务级别或者数据库级别进行监控,可以参考文档:SQL Server DDL触发器运用,效果如下图所示:

(Figure1:触发器的日志)
2. 也可以使用数据库DDL事件通知,可以参考文档:SQL Server 事件通知(Event notifications),效果如上图所示;
3. 第三种方案就是变更数据捕获(CDC),可以参考文档:SQL Server 变更数据捕获(CDC)监控表数据
4. 第四种方案就是这篇文章要讲到的新特性:SQL Server Audit,可以使用DATABASE AUDIT SPECIFICATION来捕获这些事件。
三.实现代码(SQL Codes)
(一) 创建服务器级别的审核,注意设置FILEPATH为对应的路径,显示设置审核状态,创建审核的时候只能是服务器的;
USE master
GO
--创建服务器级别审核
CREATE SERVER AUDIT ServerAudit
TO FILE (FILEPATH = 'F:\AuditLog\', MAXSIZE = 256 MB)
WITH (ON_FAILURE = CONTINUE);
GO
--开启审核
ALTER SERVER AUDIT ServerAudit
WITH (STATE = ON);
(二) 创建服务器级别的审核规范,这里指定相对应的AUDIT(审核)接收、保存跟踪和记录的数据,可以同时多个审核规范指向同一个审核。
SCHEMA_OBJECT_CHANGE_GROUP,针对架构执行 CREATE、ALTER 或 DROP 操作时将引发此事件。任何数据库的任何架构发生更改时,均将引发此事件。审核操作组的其它值可以参考:SQL Server 审核操作组和操作
--创建服务器级别审核规范
USE master
GO
CREATE SERVER AUDIT SPECIFICATION Schema_Change
FOR SERVER AUDIT ServerAudit
ADD (SCHEMA_OBJECT_CHANGE_GROUP)
WITH (STATE = ON);
GO
(三) 手动产生对象更改事件
--测试
CREATE TABLE dbo.TestAudit(Id INT)
GO
CREATE TRIGGER dbo.TestAudit_Trigger ON dbo.TestAudit
FOR INSERT
AS
BEGIN
SELECT * FROM dbo.TestAudit;
END
GO
(四) 查询Audit的记录,这里针对审核ServerAudit的内容进行查询:
--查询
SELECT database_name,
event_time,
succeeded,
server_principal_name,
[object_name],
[statement]
FROM sys.fn_get_audit_file('F:\AuditLog\ServerAudit_*.sqlaudit', default, default)

(Figure2:操作记录)
四.注意事项(Attention)
1. 审核必须已存在,才能为它创建服务器审核规范。 服务器审核规范在创建之后处于禁用状态。
2. CREATE SERVER AUDIT 语句位于事务范围内。 如果对事务进行回滚,也将对该语句进行回滚。
3. 经过审核的事件可以写入事件日志或审核文件。
4. 定义审核时,将指定结果的输出位置。 这是审核的目标位置。 审核是在禁用状态下创建的,因此不会自动审核任何操作。 启用审核后,审核目标将从审核接收数据,目标可以是文件、Windows 安全事件日志或 Windows 应用程序事件日志。
5. 通过使用 Windows“事件查看器”、“日志文件查看器”或 fn_get_audit_file 函数来读取审核事件。
6. 如果在启动审核期间出现问题,则服务器将不会启动。 在这种情况下,可以在命令行中使用 –f 选项来启动服务器。
五.疑问(Questions)
1. 如何对*.sqlaudit这些日志进行归档或者删除内容呢?
2. 使用sys.fn_get_audit_file获取到的event_time跟当前的时间不对应,什么问题?
3. 使用sys.fn_get_audit_file为什么获取到的记录有空的呢?如果说database_name为空到是还好解释,因为有些操作可能是服务器级别的,这个字段为空到是说的过去,但是[object_name]和[statement]为什么没有内容呢?

(Figure3:空值)
4. 如果我创建表失败了,为什么返回的记录中还是显示成功的呢?,执行下面的SQL时返回了下面的错误信息,但是记录的succeeded字段显示为1。
消息2714,级别16,状态6,第2 行
数据库中已存在名为'TestAudit' 的对象。

(Figure4:创建表失败)
5. Audit与C2是什么关系呢?
6. C2禁用的时候不能马上生效,需要重启数据库服务,这是为什么呢?
7. 如何修改C2日志文件的路径?
解答:要想修改C2日志文件的路径,那就先要知道这个默认的路径在哪里?在数据库属性中设置数据库的默认位置,开启C2开关,就能把类似audittrace20130710105730.trc的文件保存到下图设置的路径当中。

(Figure5:重设C2记录文件的保存路径)
8. 为什么修改了路径之后的显示是这样的?Path Field Limits

(Figure6:路径)
六.参考文献(References)
使用SQLServer Audit来监控触发器的启用、禁用情况
CREATE SERVER AUDIT (Transact-SQL)
SQL Server Audit (Database Engine)
SQL Server Audit监控触发器状态的更多相关文章
- 监控SQL:通过SQL Server的DML触发器来监控哪些IP对表的数据进行了修改(2)
原文:监控SQL:通过SQL Server的DML触发器来监控哪些IP对表的数据进行了修改(2) 在有些公司中,由于管理的不规范,或者是便于开发人员直接修改.部署程序,往往任何开发人员,都能登录到生产 ...
- 监控SQL:通过SQL Server的DDL触发器来监控数据库结构的变化(1)
原文:监控SQL:通过SQL Server的DDL触发器来监控数据库结构的变化(1) 如果你要同步不同数据库之间的数据,首先会想到的是数据库复制技术,但如果让你同步数据库的结构,你会想到什么呢? 下面 ...
- SQL Server Profiler监控SQL Server性能
全面掌握SQL Server Profiler 1. 原理与相关概念介绍 SQL Server Profiler,大家已经非常熟悉.常常在性能优化中使用,本文档详细介绍SQL Server ...
- 1. SQL Server服务器监控实现方法
对于服务器的监控,和对数据库的监控,很少有合二为一的工具,如果有的话,一般是付费软件,或者自行开发的工具.所以如果不想购买软件,也不想花精力去开发的话,可以结合一些免费/开源的工具.自定义脚本,来完成 ...
- SQL Server 存储过程、触发器、游标
存储过程 1.存储过程是事先编好的.存储在数据库中的程序,这些程序用来完成对数据库的指定操作. 2.系统存储过程: SQL Server本身提供了一些存储过程,用于管理有关数据库和用户的信息. 用户存 ...
- SQL Server封闭掉 触发器递归
SQL Server关闭掉 触发器递归SQL Server 是有一个开关, 可以关闭掉 触发器递归的.EXEC sp_dboption '数据库名字', 'recursive triggers', ...
- 使用SQL Server Audit记录数据库变更
最近工作中有一个需求,就是某一个比较重要的业务表经常被莫名其妙的变更.在SQL Server中这类工作如果不事前捕获记录的话,无法做到.对于捕获变更来说,可以考虑的选择包括Trace,CDC. ...
- SQL Server 中的触发器(trigger)
SQL Server 触发器 触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 ...
- SQL Server Profiler监控执行语句
SQL Server Profiler监控执行语句,这个功能主要用在实时的监控对数据库执行了什么操作,从而及时有效的跟踪系统的运行. 常规配置选项,名称.模板.保存到文件(可以复用). 事件选择,可以 ...
随机推荐
- 数据库SQL优化大总结之 百万级数据库优化方案
1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- 软件工程:黄金G点小游戏1.0
我们要做的是黄金G点小游戏: N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值. ...
- C到C++的升级
const 在C中只是个“只读变量”,并不是真正意义上的常量,通过指针能改变它,如下 #include<stdio.h> int main() { ;//声明只读变量a为0 int* p= ...
- weex image
weex 的image用来渲染图片, 可以使用img作为它的别名. 需要注意的是,他的长度可宽度必须指定, 不然它是不会工作的. 它没有任何的子组件. 有两个属性: src 用来指定图片的地址图片. ...
- C#判断数组是否为空
string[] array=new[] { "1", "2", "3", "4", "5" }; ...
- Java ArrayList和Vector、LinkedList与ArrayList、数组(Array)和列表集合(ArrayList)的区别
ArrayList和Vector的区别ArrayList与Vector主要从二方面来说. 一.同步性: Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步 ...
- HUD--递增数
递增数 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- 谢欣伦 - OpenDev原创教程 - 媒体开发库libMedia
libMedia是一个免费的简单的媒体开发库,其中的接口类与函数大都以小写的x打头,来源于我的姓氏首字母(谢欣伦). 下载 OpenDev for VS2012 libMedia提供四大功能,一是视频 ...
- 一鼓作气 博客--第八篇 note8
0.,222] list[33] except IndexError as e : print('index error ') except ValueError as e : print('valu ...
- dot
今天写程序的时候发现一个问题啊 在主函数里面吧某个指针node* r=NULL 赋值为空 然后调用函数insert(node* r,....) 在insert里面呢,我给这个指针赋值了啊 但是主函数里 ...