当前位置: 首页 > news >正文

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

    最近工作中有一个需求,就是某一个比较重要的业务表经常被莫名其妙的变更。在SQL Server中这类工作如果不事前捕获记录的话,无法做到。对于捕获变更来说,可以考虑的选择包括Trace,CDC。但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表的Update,Insert,Delete操作。

 

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

image

图1.查看审核日志

 

    结果如图2所示。

image

图2.数据库审核记录

 

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

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

转载于:https://www.cnblogs.com/CareySon/p/4204027.html

相关文章:

  • PHPCMS实现文章置顶功能的方法
  • 关于函数返回值的一些见解
  • Git 的是使用入门
  • Hover States - 有趣的用户界面及交互设计
  • JavaScript Array创建数组
  • C缺陷与陷阱----读书笔记---第一章
  • 利用firefox调试安卓手机端web
  • 笔记:Java面向对象编程 第10章 类的生命周期
  • 锁定应用,解锁应用,锁卡,解卡,更改密码指令
  • Matlab的部分文件操作
  • 如何管理?
  • 系统时钟和硬件时钟同步
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • zblog2.0博客建站视频教程
  • Product Google的十大设计原则
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 2018一半小结一波
  • EventListener原理
  • HTTP 简介
  • jquery cookie
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • SpiderData 2019年2月16日 DApp数据排行榜
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 入门到放弃node系列之Hello Word篇
  • 我这样减少了26.5M Java内存!
  • 用Canvas画一棵二叉树
  • Python 之网络式编程
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • # 飞书APP集成平台-数字化落地
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • $().each和$.each的区别
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (差分)胡桃爱原石
  • (多级缓存)多级缓存
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (推荐)叮当——中文语音对话机器人
  • (一)u-boot-nand.bin的下载
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • ***详解账号泄露:全球约1亿用户已泄露
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .NET中的十进制浮点类型,徐汇区网站设计
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • ??在JSP中,java和JavaScript如何交互?
  • @31省区市高考时间表来了,祝考试成功
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • @PreAuthorize注解
  • [ C++ ] 继承
  • [2021 蓝帽杯] One Pointer PHP
  • [C#基础]说说lock到底锁谁?
  • [C++]unordered系列关联式容器
  • [CakePHP] 在Controller中使用Helper