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