AutoAudit研究学习
AutoAudit介绍
AutoAudit这个是Paul Nielsen写的一个开源的审计跟踪的脚本项目,项目位于https://autoaudit.codeplex.com/上,Paul Nielsen的一篇博客CodeGen to Create Fixed Audit Trail Triggers上也介绍了他创建这个项目的前因后果。目前最新的版本为3.30a,官方文档写着支持SQL Server 2005, 2008, 2012。根据我的测试,SQL Server 2014也是支持的。看了这个项目最后一次更新时间为2012年,也就是说那个时候SQL Server 2014、SQL Server 2016、SQL Server 2017都还没有发布。可以这样说,AudoAudit这个项目自2012年后,已经停止更新了。
那么AutoAudit这个脚本能做那些跟踪审计方面的工作呢?下面笼统的总结了一下AutoAudit的功能:
1: 审计、跟踪记录所有的DDL脚本。
它创建了一个数据库DDL的触发器,它会捕获DDL相关脚本。例如,创建、修改、删除数据库对象等。
2: 审计DML(INSERT、UPDATE、DELETE)的脚本以及数据变化。
可以灵活配置、动态监控某个表、或一批表、或者所有表的DML操作,例如INSERT、UPDATE、DELTE操作,可以只捕获SQL语句,也可以捕获相关值的变化(记录修改前的值与修改后的值)。可以设置参数、在被监控的表上动态的生成触发器等。
AutoAudit部署
AutoAudit的部署是非常简单的事情,你从官方下载一个AutoAudit的SQL脚本,例如当前版本为AutoAudit 3.30a.sql,你可以修改一些变量或不做修改,在你需要做审计跟踪的数据库执行脚本就轻松部署了。当然,如果你要搞懂、弄透的话,还得花费一番功夫研究一下脚本。AutoAudit 3.30a.sql的脚本大概6000多行,里面有大量的注释,代码非常优雅、简洁。个人拜读起来,感觉就是一件精雕细琢的艺术品,爽心悦目。下面来简单介绍一下这个开源项目吧,估计认真看代码的没有几个人。
如果你没有修改任何参数,执行完这个脚本后,就会在当前数据库上创建下面一些对象:
1:数据库DDL触发器SchemaAuditDDLTrigger
2:创建一些数据库对象,如果没有修改参数@AuditSchema,默认创建在Audit这个Schema下面。
Table(8个)
[Audit].[AuditAllExclusions] 排除审计、跟踪的表
[Audit].[AuditBaseTables] 记录审计、跟踪表的相关参数,它会取这里的相关值动态生成相关触发器。默认为空
[Audit].[AuditDetail] 记录表数据INSERT、UPDATE、DELETE变化前后的值(可以记录全部字段或部分字段)
[Audit].[AuditDetailArchive] [Audit].[AuditDetail]的归档数据。
[Audit].[AuditHeader] 记录表DML操作的相关用户、应用程序、以及SQL语句等。
[Audit].[AuditHeaderArchive] [Audit].[AuditDetail]表的数据归档表
[Audit].[AuditSettings] AutoAudit的相关参数
[Audit].[SchemaAudit] 记录数据库的DDL信息,例如SQL、应用程序等等。
View(5个)
[Audit].[vAudit]
[Audit].[vAuditAll]
[Audit].[vAuditArchive]
[Audit].[vAuditDetailAll]
[Audit].[vAuditHeaderAll]
Procedure(16个)
[Audit].[pAutoAuditArchive]
[Audit].[pAutoAudit]
[Audit].[pAutoAuditRebuild]
[Audit].[pAutoAuditRebuildAll]
[Audit].[pAutoAuditDrop]
[Audit].[pAutoAuditAll]
[Audit].[pAutoAuditSetTriggerState]
[Audit].[pAutoAuditSetTriggerStateAll]
[Audit].[pAutoAuditDropAll]
[Audit].[GenerateIt]
[Audit].[SuspendIt]
[Audit].[ReactivateIt]
[Audit].[RemoveIt]
[Audit].[ProcessExpiredDataAudits]
[Audit].[ProcessDataAuditsCleanup]
[Audit].[ProcessDataAuditsCleanupForAllDb]
表 [Audit].[AuditSettings]是配置信息表,关于AudoAudit的配置信息都位于该表。如果要了解、学习AudoAudit这个项目,那么必须了解这些参数。参数具体功能可以参加脚本注释信息.
SELECT * FROM [Audit].[AuditSettings]
此时,你查询[Audit].[SchemaAudit],发现数据库DDL触发器已经捕获了你创建视图、存储过程等等的DDL脚本
下面我们来测试一下AutoAudit的功能吧, 如下所示,我们清空[Audit].[SchemaAudit]下数据,然后创建、修改TEST表,具体测试脚本如下,数据库的DDL触发器会捕获相关DDL SQL,当然DML操作是不会被捕获的。
TRUNCATE TABLE [Audit].[SchemaAudit]
GO
CREATE TABLE TEST(ID INT ,NAME VARCHAR(12));
GO
ALTER TABLE TEST ADD SEX BIT;
GO
ALTER TABLE TEST DROP COLUMN SEX;
GO
使用账号tmp登录数据库,执行下面一批脚本
USE YourSQLDba;
GO
CREATE TABLE TEST(ID INT, NAME VARCHAR(24));
GO
ALTER TABLE TEST ADD SEX BIT;
GO
INSERT INTO TEST
SELECT 1000, 'KERRY', 1 ;
GO
DROP TABLE TEST;
GO
如下所示,SchemaAuditDDLTrigger触发器会捕获DDL相关脚本记录到表下[Audit].[SchemaAudit],XMLEventData里面包含了具体、详细的信息。例如脚本执行的时间、ServerName等等。
那么接下来,我们想审计、跟踪某个具体表,例如,我们想审计、跟踪[Maint].[DataBaseSizeDtl_Day]表,那么可以通过存储过程Audit.pAutoAudit去实现
EXEC Audit.pAutoAudit @SchemaName = 'Maint', -- sysname
@TableName = 'DataBaseSizeDtl_Day', -- sysname
@ColumnNames = '<All>', -- varchar(max)
@StrictUserContext = 1, -- bit
@LogSQL = 1, -- bit
@BaseTableDDL = 0, -- bit
@LogInsert = 2, -- tinyint
@LogUpdate = 2, -- tinyint
@LogDelete = 2 -- tinyint
存储过程是根据参数,动态生成被审计表的相关触发器,如下所示,
ALTER PROC [Audit].[pAutoAudit]
(
@SchemaName sysname = 'dbo',--this is the default schema name for the tables getting AutoAudit added
@TableName sysname, --enter the name of the table to add AutoAudit to.
@ColumnNames varchar(max)= '<All>',--columns to include when logging details (@Log...=2). Default = '<All>'. Format: '[Col1],[Col2],...'
@StrictUserContext bit = 1, -- 2.00 if 0 then permits DML setting of Created, CreatedBy, Modified, ModifiedBy
@LogSQL bit = 0, -- 0 = Don't log SQL statement in AuditHeader, 1 = log the SQL statement
@BaseTableDDL bit = 0, -- 0 = don't add audit columns to base table, 1 = add audit columns to base table
@LogInsert tinyint = 2, -- 0 = nothing, 1 = header only, 2 = header and detail
@LogUpdate tinyint = 2, -- 0 = nothing, 1 = header only, 2 = header and detail
@LogDelete tinyint = 2 -- 0 = nothing, 1 = header only, 2 = header and detail
)
注意,对应参数的不同值会影响触发器以及审计内容以及数据。
@SchemaName 审计表的Schema
@TableName 审计表的表名
@ColumnNames 表的字段,如果只为<All>那么在AuditDetail记录所有字段的变化值,也可以只记录某个或某些字段的值。
@StrictUserContext 默认为1,如果为0,那么会在跟踪升级表上增加字段[AutoAudit_CreatedDate]、[AutoAudit_CreatedBy]等。
@LogSQL 0表示不会AuditHeader中记录DML操作的SQL,1表示在AuditHeader中记录DML操作的SQL
@BaseTableDDL 0表示在基表不增加审计字段,1表示在基表增加审计字段
@LogInsert 0表示不审计任何INSERT,1表示只会记录SQL等信息到表AuditHeader,2表示不仅捕获SQL等信息,还会捕获详细数据变化值到AuditDetail
@LogUpdate 0表示不审计任何UPDATE,1表示只会记录SQL等信息到表AuditHeader,2表示不仅捕获SQL等信息,还会捕获详细数据变化值到AuditDetail
@LogDelete 0表示不审计任何DELETE,1表示只会记录SQL等信息到表AuditHeader,2表示不仅捕获SQL等信息,还会捕获详细数据变化值到AuditDetail
就会在'DataBaseSizeDtl_Day'下面生成三个触发器DataBaseSizeDtl_Day_Audit_Delete、DataBaseSizeDtl_Day_Audit_Insert、DataBaseSizeDtl_Day_Audit_Update,然后我们往这个表插入数据(启动作业YourSQLDba_Monitor_Database_Daily_Growth)即可,那么接下来,查看[Audit].[AuditHeader]表,就能看到什么HostName、SysUser、Application、Table、Operation、SQLStatement等等具体信息
SELECT * FROM [Audit].[AuditHeader]
SELECT * FROM AUDIT.AuditDetail
AutoAudit的优缺点
AudtoAudit配置简单、灵活,可以在做到基本审核或精细审核,完全可以根据需要定制审计粒度信息; 另外,代码中有许多地方值得我们学习、借鉴的地方。但是测试AutoAudit的过程中也发现了一些Bug,目前该项目停止更新,需要自己解决这些问题,例如,当主键的字段不是第一列并且指定具体列@ColumnNames时,那么在使用Audit.pAutoAudit 创建相关触发器时就会报错,如下截图所示
USE YourSQLDba;
GO
SELECT * INTO db_objects FROM sys.objects;
ALTER TABLE db_objects ADD CONSTRAINT pk_db_objects PRIMARY KEY(OBJECT_ID);
GO
EXEC Audit.pAutoAudit @SchemaName = 'dbo',
@TableName = 'db_objects',
@ColumnNames = '[type_desc],[create_date]',
@StrictUserContext = 1,
@LogSQL = 1,
@BaseTableDDL = 0,
@LogInsert = 1,
@LogUpdate = 1,
@LogDelete = 1
当然也还有一些其他bug,如下所:
EXEC Audit.pAutoAudit @SchemaName = 'dbo',
@TableName = 'db_objects',
@ColumnNames = '<all>',
@StrictUserContext = 1,
@LogSQL = 1,
@BaseTableDDL = 0,
@LogInsert = 1,
@LogUpdate = 1,
@LogDelete = 1
这个都需要你调试代码,找出错误的原因,修改相关代码(主要都是动态生成SQL时,有一些SQL语法错误,例如多了一个,等等),目前。已经我已经发现并修改了该代码多处地方的小Bug。
最后跟踪审计,如果没有必要的话,最好不要开启,除非是为查找定位一些问题,因为毕竟这个还是有很多额外的性能开销、损耗,尤其是这种使用触发器来跟踪、审计,AutoAudit也明确指出这个会影响性能:“Adding AutoAudit to your tables will impact performance.”
参考资料:
https://autoaudit.codeplex.com/
AutoAudit研究学习的更多相关文章
- 利用Mono.Cecil动态修改程序集来破解商业组件(仅用于研究学习)
原文 利用Mono.Cecil动态修改程序集来破解商业组件(仅用于研究学习) Mono.Cecil是一个强大的MSIL的注入工具,利用它可以实现动态创建程序集,也可以实现拦截器横向切入动态方法,甚至还 ...
- 【转】手把手教你读取Android版微信和手Q的聊天记录(仅作技术研究学习)
1.引言 特别说明:本文内容仅用于即时通讯技术研究和学习之用,请勿用于非法用途.如本文内容有不妥之处,请联系JackJiang进行处理! 我司有关部门为了获取黑产群的动态,有同事潜伏在大量的黑产群 ...
- 手把手教你读取Android版微信和手Q的聊天记录(仅作技术研究学习)
1.引言 特别说明:本文内容仅用于即时通讯技术研究和学习之用,请勿用于非法用途.如本文内容有不妥之处,请联系JackJiang进行处理! 我司有关部门为了获取黑产群的动态,有同事潜伏在大量的黑产群 ...
- 基于python的opcode优化和模块按需加载机制研究(学习与个人思路)(原创)
基于python的opcode优化和模块按需加载机制研究(学习与思考) 姓名:XXX 学校信息:XXX 主用编程语言:python3.5 个人技术博客:http://www.cnblogs.com/M ...
- UnityEditor研究学习之自定义Editor
UnityEditor研究学习之自定义Editor 今天我们来研究下Unity3d中自定义Editor,这个会让物体的脚本在Inspector视窗中,产生不同的视觉效果. 什么意思,举个例子,比如游戏 ...
- AY的Dapper研究学习-继续深入-C#开发-aaronyang技术分享
原文:AY的Dapper研究学习-继续深入-C#开发-aaronyang技术分享 ====================www.ayjs.net 杨洋 wpfui.com ...
- AY的Dapper研究学习-基本入门-C#开发-aaronyang技术分享
原文:AY的Dapper研究学习-基本入门-C#开发-aaronyang技术分享 ====================www.ayjs.net 杨洋 wpfui.com ...
- MySQL深入研究--学习总结(2)
前言 接上文,继续学习后续章节. 第四章&第五章<深入浅出索引> 这两章节主要介绍的索引结构及其如何合理建立索引,但是我觉得讲的比较简单. 总结回顾下吧,其实在我之前的文章< ...
- MySQL深入研究--学习总结(5)
前言 接上文,继续学习后续章节.细心的同学已经发现,我整理的并不一定是作者讲的内容,更多是结合自己的理解,加以阐述,所以建议结合原文一起理解. 第20章<幻读是什么,幻读有什么问题?> 先 ...
随机推荐
- Percona监控MySQL模板详解
InnoDB Adaptive Hash Index 显示了"自适应哈希索引"的使用情况,哈希索引只能用来搜索等值的查询. # Hash table size 17700827, ...
- 09_Python深拷贝、浅拷贝
一.循环列表,删除其中的元素 l1 = [1,2,3,4,5,6,7] 循环删除奇数位元素 1.正序循环删除,会出现越界情况,所以采用倒叙的方式删除 l1 = [1,2,3,4,5,6,7] for ...
- Spring Boot快速入门(最新)
本章通过完成Spring Boot基础项目的构建并实现一个简单的Http请求处理,让大家对Spring Boot有一个初步的了解,并体验其结构简单.开发快速的特性.预计阅读及演练过程将花费约5分钟. ...
- Sonar 常用代码规则整理(二)
摘要:公司部署了一套sonar,经过一段时间运行,发现有一些问题出现频率很高,因此有必要将这些问题进行整理总结和分析,避免再次出现类似问题. 作者原创技术文章,转载请注明出处 ============ ...
- SpringMVC源码情操陶冶-HandlerAdapter适配器简析
springmvc中对业务的具体处理是通过HandlerAdapter适配器操作的 HandlerAdapter接口方法 列表如下 /** * Given a handler instance, re ...
- Apache优化配置:修改最大并发连接数
此文摘自: http://www.365mini.com/page/apache-concurrency-configuration.htm Apache查看连接数和限制当前的连接数 : http:/ ...
- BZOJ 2938: [Poi2000]病毒 [AC自动机 拓扑排序]
2938: [Poi2000]病毒 题意:判断是否存在无限长的不含模式串的字符串.只有01. 建出套路DP的转移图,判断有环就行了 练习一下拓扑排序 #include <iostream> ...
- BZOJ 2064: 分裂 [DP 状压 转化]
传送门 题意:一开始$n$块面积最后$m$块面积,面积和相等每次可以分裂或者合并,问最少几次 昨天忘发了... 不会.... 考虑最差情况,$n+m-2$所有先合并再分裂 发现只有当前后两个子集相等时 ...
- CF 235C. Cyclical Quest [后缀自动机]
题意:给一个主串和多个询问串,求询问串的所有样子不同的周期同构出现次数和 没有周期同构很简单就是询问串出现次数,|Right| 有了周期同构,就是所有循环,把询问串复制一遍贴到后面啊!思想和POJ15 ...
- 二、urllib进阶
Handler处理器 和 自定义Opener opener是 urllib.request.OpenerDirector 的实例,我们之前一直都在使用的urlopen,它是一个特殊的opener(也就 ...