为了账号安全,请及时绑定邮箱和手机立即绑定

使用SQL Server Audit记录数据库变更

标签:
SQL Server

    最近工作中有一个需求就是某一个比较重要的业务表经常被莫名其妙的变更。在SQL Server中这类工作如果不事前捕获记录的话无法做到。对于捕获变更来说可以考虑的选择包括TraceCDC。但Trace的成本比较大对于负载量较高的系统并不合适而CDC需要影响业务库因此SQL Server Audit就是一个比较好的选择。

     在SQL Server中如果只是希望获得表的更新时间只需要看表的聚集索引的最后更新时间即可代码如下

SELECT OBJECT_NAME(OBJECT_ID) AS DatabaseName, last_user_update,*  
FROM sys.dm_db_index_usage_stats    
WHERE database_id = DB_ID( 'DateBaseName')    
AND OBJECT_ID=OBJECT_ID('TableName')

 

    但这种方式并不能看到由某人在某个时间修改了某个表在此使用Server Audit。Server Audit底层采用的是扩展事件且存储结构可以以单独文件独立于用户库因此不仅性能较好也不会对用户库产生影响。

    下面是启用审核的T-SQL代码

USE master  
CREATE SERVER AUDIT audit1 TO FILE (FILEPATH='D:\SQLAudit')    
USE AdventureWorks2012    
CREATE DATABASE AUDIT SPECIFICATION SerialPic FOR SERVER AUDIT audit1    
ADD(UPDATE,INSERT,DELETE ON Person.Address by dbo)

 

USE master  
CREATE SERVER AUDIT audit1 TO FILE (FILEPATH='D:\SQLAudit')    
USE AdventureWorks2012    
CREATE DATABASE AUDIT SPECIFICATION SerialPic FOR SERVER AUDIT audit1    
ADD(UPDATE,INSERT,DELETE ON Person.Address by dbo)

 

   上述代码首先创建服务器级别的审核并存入D\SQLAudit中然后对应创建数据库级别的审核。在数据库级别的审核中跟踪Person.Address表的UpdateInsertDelete操作。

 

    接下来尝试修改数据库Person.Address在安全-审核下查看审核日志如图1所示。

图1.查看审核日志

 

    结果如图2所示。

图2.数据库审核记录

 

    这样就可以看到谁在什么时间曾经对该表做过哪些修改。当然除了UI方式也可以通过T-SQL方式查看审核记录。

SELECT * FROM    
fn_get_audit_file('D:\SQLAudit\audit1_B8A7821A-D735-446D-B6FA-DF582AB80375_0_130648999540780000.sqlaudit', default, default)

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消