审计、跟踪记录全数的DDL脚本,审计、跟踪记录全部的DDL脚本

 

 

AutoAudit介绍

AutoAudit介绍

 

 

Auto奥迪(Audi)t那么些是Paul尼尔斯en写的三个开源的审计跟踪的台本项目,项目位于https://autoaudit.codeplex.com/上,Paul
尼尔斯en的一篇博客CodeGen to Create Fixed 奥迪(Audi)t Trail
Triggers上也介绍了她创建那些类其他前因后果。方今前卫的版本为3.30a,官方文档写着资助SQL Server 二零零六, 2010,
二零一三。依照本人的测试,SQL Server
2016也是接济的。看了这一个类型最后一遍立异时间为二〇一三年,相当于说那个时候SQL Server 二〇一六、SQL Server 二零一六、SQL Server
2017都还从未发布。可以这么说,Audo奥迪t那些类型自二零一三年后,已经告一段落更新了。

Auto奥迪(Audi)t那些是Paul尼尔斯en写的1个开源的审计跟踪的剧本项目,项目坐落https://autoaudit.codeplex.com/上,Paul
尼尔斯en的一篇博客CodeGen to Create Fixed 奥迪(Audi)t Trail
Triggers上也介绍了她创设这么些项目的前因后果。近日风靡的本子为3.30a,官方文档写着接济SQL Server 二〇〇七, 2010,
二〇一一。依据自个儿的测试,SQL Server
二零一四也是支撑的。看了那个项目最后三次革新时间为2011年,相当于说那多少个时候SQL Server 201⑥ 、SQL Server 二零一四、SQL Server
2017都还并未公布。可以这么说,Audo奥迪t这些类型自二零一二年后,已经告一段落更新了。

 

 

 

 

那就是说Auto奥迪(Audi)t那么些剧本能做那多少个跟踪审计方面的工作吧?上边笼统的下结论了一下Auto奥迪(Audi)t的效应:

那就是说Auto奥迪(Audi)t这些剧本能做这贰个跟踪审计方面的做事吧?上边笼统的总计了一下Auto奥迪t的功用:

 

 

1:
审计、跟踪记录全数的DDL脚本。

1:
审计、跟踪记录全部的DDL脚本。

 

 

   它成立了一个数据库DDL的触发器,它会捕获DDL相关脚本。例如,创制、修改、删除数据库对象等。

   它成立了3个数据库DDL的触发器,它会捕获DDL相关脚本。例如,创造、修改、删除数据库对象等。

 

 

2:
审计DML(INSECR-VT、UPDATE、DELETE)的剧本以及数额变化。

2:
审计DML(INSEPAJEROT、UPDATE、DELETE)的剧本以及数额变化。

 

 

   可以灵活计划、动态监督某些表、或一批表、或然全体表的DML操作,例如INSE汉兰达T、UPDATE、DELTE操作,可以只捕获SQL语句,也得以捕获相关值的生成(记录修改前的值与修改后的值)。可以设置参数、在被监督的表上动态的变化触发器等。

   可以灵活安顿、动态监控有个别表、或一批表、或然全部表的DML操作,例如INSEQashqaiT、UPDATE、DELTE操作,可以只捕获SQL语句,也足以捕获相关值的生成(记录修改前的值与修改后的值)。可以安装参数、在被监控的表上动态的变化触发器等。

 

 

 

 

AutoAudit部署

AutoAudit部署

 

 

Auto奥迪(Audi)t的配置是卓殊不难的事务,你从官方下载1个Auto奥迪t的SQL脚本,例如当前版本为Auto奥迪(Audi)t
3.30a.sql,你能够修改部分变量或不做修改,在您须要做审计跟踪的数据库执行脚本就自在安顿了。当然,假如你要搞懂、弄透的话,还得开销一番素养商讨一下剧本。Auto奥迪(Audi)t
3.30a.sql的剧本大致4000多行,里面有大气的诠释,代码分外优雅、简洁。个人拜读起来,感觉就是一件精雕细琢的艺术品,爽心悦目。下边来大约介绍一下以此开源项目吧,估算认真看代码的没有几人。

Auto奥迪t的布置是万分简单的业务,你从官方下载3个Auto奥迪(Audi)t的SQL脚本,例如当前版本为Auto奥迪t
3.30a.sql,你可以修改部分变量或不做修改,在你必要做审计跟踪的数据库执行脚本就自在布置了。当然,倘若你要搞懂、弄透的话,还得开支一番功力研讨一下剧本。Auto奥迪(Audi)t
3.30a.sql的脚本大概肆仟多行,里面有恢宏的注释,代码相当优雅、简洁。个人拜读起来,感觉就是一件精雕细琢的艺术品,爽心悦目。上边来总结介绍一下以此开源项目吧,预计认真看代码的从未有过几人。

 

 

图片 1

图片 2

 

 

 

 

假诺你从未改动任何参数,执行完这些本子后,就会在如今数据库上创制下边一些对象:

万一你从未改动任何参数,执行完那几个本子后,就会在时下数据库上创造下边一些对象:

 

 

1:数据库DDL触发器SchemaAuditDDLTrigger

1:数据库DDL触发器SchemaAuditDDLTrigger

 

 

2:创立一些数据库对象,就算没有改动参数@奥迪(Audi)tSchema,暗许创造在奥迪(Audi)t这么些Schema上面。

2:创设一些数据库对象,如若没有改动参数@奥迪tSchema,暗中认同创设在奥迪(Audi)t那一个Schema下边。

 

 

Table(8个)

Table(8个)

[Audit].[AuditAllExclusions]     排除审计、跟踪的表

[Audit].[AuditAllExclusions]     排除审计、跟踪的表

[Audit].[AuditBaseTables]       
记录审计、跟踪表的连锁参数,它会取那里的相关值动态变化相关触发器。默许为空

[Audit].[AuditBaseTables]       
记录审计、跟踪表的连锁参数,它会取那里的相关值动态变化相关触发器。默许为空

[Audit].[AuditDetail]           
记录表数据INSE中华VT、UPDATE、DELETE变化前后的值(可以记录整个字段或局地字段)

[Audit].[AuditDetail]           
记录表数据INSEQX56T、UPDATE、DELETE变化前后的值(可以记下整个字段或部分字段)

[Audit].[AuditDetailArchive]    
[Audit].[AuditDetail]的存档数据。

[Audit].[AuditDetailArchive]    
[Audit].[AuditDetail]的存档数据。

[Audit].[AuditHeader]           
记录表DML操作的连锁用户、应用程序、以及SQL语句等。

[Audit].[AuditHeader]           
记录表DML操作的连锁用户、应用程序、以及SQL语句等。

[Audit].[AuditHeaderArchive]    
[Audit].[AuditDetail]表的多寡归档表

[Audit].[AuditHeaderArchive]    
[Audit].[AuditDetail]表的数目归档表

[Audit].[AuditSettings]         
Auto奥迪(Audi)t的连带参数

[Audit].[AuditSettings]         
Auto奥迪(Audi)t的有关参数

[Audit].[SchemaAudit]           
记录数据库的DDL音信,例如SQL、应用程序等等。

[Audit].[SchemaAudit]           
记录数据库的DDL新闻,例如SQL、应用程序等等。

 

 

 

 

View(5个)

View(5个)

 

 

[Audit].[vAudit]

[Audit].[vAudit]

[Audit].[vAuditAll]

[Audit].[vAuditAll]

[Audit].[vAuditArchive]

[Audit].[vAuditArchive]

[Audit].[vAuditDetailAll]

[Audit].[vAuditDetailAll]

[Audit].[vAuditHeaderAll]

[Audit].[vAuditHeaderAll]

 

 

 

 

Procedure(16个)

Procedure(16个)

 

 

[Audit].[pAutoAuditArchive]

[Audit].[pAutoAuditArchive]

[Audit].[pAutoAudit]

[Audit].[pAutoAudit]

[Audit].[pAutoAuditRebuild]

[Audit].[pAutoAuditRebuild]

[Audit].[pAutoAuditRebuildAll]

[Audit].[pAutoAuditRebuildAll]

[Audit].[pAutoAuditDrop]

[Audit].[pAutoAuditDrop]

[Audit].[pAutoAuditAll]

[Audit].[pAutoAuditAll]

[Audit].[pAutoAuditSetTriggerState]

[Audit].[pAutoAuditSetTriggerState]

[Audit].[pAutoAuditSetTriggerStateAll]

[Audit].[pAutoAuditSetTriggerStateAll]

[Audit].[pAutoAuditDropAll]

[Audit].[pAutoAuditDropAll]

[Audit].[GenerateIt]

[Audit].[GenerateIt]

[Audit].[SuspendIt]

[Audit].[SuspendIt]

[Audit].[ReactivateIt]

[Audit].[ReactivateIt]

[Audit].[RemoveIt]

[Audit].[RemoveIt]

[Audit].[ProcessExpiredDataAudits]

[Audit].[ProcessExpiredDataAudits]

[Audit].[ProcessDataAuditsCleanup]

[Audit].[ProcessDataAuditsCleanup]

[Audit].[ProcessDataAuditsCleanupForAllDb]

[Audit].[ProcessDataAuditsCleanupForAllDb]

 

 

 

 


[Audit].[AuditSettings]是安排音讯表,关于Audo奥迪(Audi)t的布局音讯都坐落该表。尽管要精通、学习Audo奥迪(Audi)t这些系列,那么必须精晓这么些参数。参数具体效果可以参与脚本注释消息.


[Audit].[AuditSettings]是布局音信表,关于Audo奥迪t的配置音信都位于该表。如果要询问、学习Audo奥迪t那一个项目,那么必须询问那个参数。参数具体职能可以参预脚本注释音信.

 

 

 

 

SELECT
* FROM [Audit].[AuditSettings]

SELECT
* FROM [Audit].[AuditSettings]

 

 

 

 

此时,你查询[Audit].[SchemaAudit],发现数据库DDL触发器已经捕获了您创制视图、存储进度等等的DDL脚本

此时,你查询[Audit].[SchemaAudit],发现数据库DDL触发器已经捕获了您创建视图、存储过程等等的DDL脚本

 

 

图片 3

图片 4

 

 

 

 

上面大家来测试一下Auto奥迪(Audi)t的听从吗,
如下所示,我们清空[Audit].[SchemaAudit]下多少,然后创制、修改TEST表,具体测试脚本如下,数据库的DDL触发器会捕获相关DDL SQL,当然DML操作是不会被抓获的。

上边大家来测试一下AutoAudit的功用吗,
如下所示,我们清空[Audit].[SchemaAudit]下数据,然后创设、修改TEST表,具体测试脚本如下,数据库的DDL触发器会捕获相关DDL SQL,当然DML操作是不会被抓获的。

 

 

TRUNCATE
TABLE [Audit].[SchemaAudit]

TRUNCATE
TABLE [Audit].[SchemaAudit]

 

 

GO

GO

 

 

CREATE
TABLE TEST(ID INT ,NAME VARCHAR(12));

CREATE
TABLE TEST(ID INT ,NAME VARCHAR(12));

GO

GO

ALTER
TABLE TEST ADD SEX BIT;

ALTER
TABLE TEST ADD SEX BIT;

GO

GO

ALTER
TABLE TEST DROP COLUMN SEX;

ALTER
TABLE TEST DROP COLUMN SEX;

GO

GO

 

 

 

 

图片 5

图片 6

 

 

 

 

 

 

 

 

运用账号tmp登录数据库,执行上边一批脚本

选用账号tmp登录数据库,执行下边一批脚本

 

 

 

 

USE
YourSQLDba;

USE
YourSQLDba;

GO

GO

CREATE
TABLE TEST(ID INT, NAME VARCHAR(24));

CREATE
TABLE TEST(ID INT, NAME VARCHAR(24));

GO

GO

ALTER
TABLE TEST ADD SEX BIT;

ALTER
TABLE TEST ADD SEX BIT;

GO

GO

INSERT
INTO TEST

INSERT
INTO TEST

SELECT
1000, ‘KERRY’, 1 ;

SELECT
1000, ‘KERRY’, 1 ;

GO

GO

DROP
TABLE TEST;

DROP
TABLE TEST;

GO

GO

 

 

 

 

一般来说所示,Schema奥迪(Audi)tDDLTrigger触发器会捕获DDL相关脚本记录到表下[Audit].[SchemaAudit],XML伊芙ntData里面富含了具体、详细的音信。例如脚本执行的小运、ServerName等等。

如下所示,Schema奥迪tDDLTrigger触发器会捕获DDL相关脚本记录到表下[Audit].[SchemaAudit],XML伊芙ntData里面含有了现实、详细的音信。例如脚本执行的光阴、ServerName等等。

 

 

图片 7

图片 8

 

 

 

 

那就是说接下去,大家想审计、跟踪某些具体表,例如,我们想审计、跟踪[Maint].[DataBaseSizeDtl_Day]表,那么可以经过存储进程奥迪(Audi)t.pAuto奥迪t去已毕

那就是说接下去,大家想审计、跟踪某些具体表,例如,我们想审计、跟踪[Maint].[DataBaseSizeDtl_Day]表,那么可以由此存储过程Audit.pAuto奥迪t去贯彻

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
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

) 
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

@SchemaName 审计表的Schema

@TableName  审计表的表名

@TableName  审计表的表名

@ColumnNames 表的字段,如若只为<All>那么在奥迪tDetail记录全体字段的变化值,也足以只记录某个或少数字段的值。

@ColumnNames 表的字段,假诺只为<All>那么在奥迪tDetail记录全数字段的变化值,也足以只记录有个别或有个别字段的值。

@StrictUserContext
暗许为1,即使为0,那么会在跟踪升级表上加码字段[AutoAudit_CreatedDate]、[AutoAudit_CreatedBy]等。

@StrictUserContext
暗中同意为1,即使为0,那么会在跟踪升级表上加码字段[AutoAudit_CreatedDate]、[AutoAudit_CreatedBy]等。

@LogSQL          
0代表不会奥迪(Audi)tHeader中记录DML操作的SQL,1意味着在奥迪tHeader中记录DML操作的SQL

@LogSQL          
0代表不会奥迪(Audi)tHeader中记录DML操作的SQL,1意味着在奥迪tHeader中记录DML操作的SQL

@BaseTableDDL     0代表在基表不增添审计字段,1代表在基表增加审计字段

@BaseTableDDL     0代表在基表不增添审计字段,1象征在基表增添审计字段

@LogInsert  0代表不审计任何INSE智跑T,1表示只会记录SQL等音信到表奥迪(Audi)tHeader,2象征不仅抓获SQL等音讯,还会捕获详细数据变化值到奥迪(Audi)tDetail

@LogInsert  0表示不审计任何INSE哈弗T,1代表只会记录SQL等音讯到表奥迪(Audi)tHeader,2意味着不仅抓获SQL等新闻,还会捕获详细数据变化值到奥迪(Audi)tDetail

@LogUpdate  0表示不审计任何UPDATE,1表示只会记录SQL等新闻到表奥迪(Audi)tHeader,2象征不仅抓获SQL等音讯,还会捕获详细数据变化值到奥迪(Audi)tDetail

@LogUpdate  0表示不审计任何UPDATE,1象征只会记录SQL等音信到表奥迪(Audi)tHeader,2意味着不仅抓获SQL等信息,还会捕获详细数据变化值到奥迪(Audi)tDetail

    @LogDelete  0表示不审计任何DELETE,1意味着只会记录SQL等新闻到表奥迪(Audi)tHeader,2表示不仅抓获SQL等音讯,还会捕获详细数据变化值到奥迪(Audi)tDetail

    @LogDelete  0代表不审计任何DELETE,1表示只会记录SQL等音信到表奥迪(Audi)tHeader,2象征不仅抓获SQL等新闻,还会捕获详细数据变化值到奥迪tDetail

 

 

 

 

图片 9

图片 10

 

 

就会在’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等等具体音讯

就会在’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].[AuditHeader]

 

 

 

 

图片 11

图片 12

 

 

 

 

SELECT
* FROM AUDIT.AuditDetail

SELECT
* FROM AUDIT.AuditDetail

 

 

 

 

图片 13

图片 14

 

 

 

 

 

 

Auto奥迪t的利害

Auto奥迪(Audi)t的优缺点

 

 

Audto奥迪t配置不难、灵活,可以在做到基本审核或精美审核,完全可以依据需求定制审计粒度音信;
别的,代码中有许多地点值得我们上学、借鉴的地方。可是测试AutoAudit的长河中也发现了一些Bug,近来该品种终止更新,须求协调化解那么些题材,例如,当主键的字段不是率先列并且钦赐具体列@ColumnNames时,那么在利用奥迪(Audi)t.pAuto奥迪(Audi)t
创立连锁触发器时就会报错,如下截图所示

Audto奥迪(Audi)t配置不难、灵活,可以在成就基本审核或精美审核,完全可以依照须要定制审计粒度消息;
其它,代码中有成千成万地方值得大家上学、借鉴的地点。不过测试Auto奥迪t的经过中也意识了一部分Bug,近期该类型截至更新,需求团结消除那一个标题,例如,当主键的字段不是第2列并且钦点具体列@ColumnNames时,那么在行使奥迪t.pAuto奥迪t
制造连锁触发器时就会报错,如下截图所示

 

 

 

 

USE
YourSQLDba;

USE
YourSQLDba;

GO

GO

 

 

SELECT
* INTO db_objects FROM sys.objects;

SELECT
* INTO db_objects FROM sys.objects;

 

 

ALTER
TABLE db_objects
ADD CONSTRAINT pk_db_objects
PRIMARY KEY(OBJECT_ID);

ALTER
TABLE db_objects
ADD CONSTRAINT pk_db_objects
PRIMARY KEY(OBJECT_ID);

 

 

GO

GO

 

 

 

 

EXEC
Audit.pAutoAudit @SchemaName = ‘dbo’,

EXEC
Audit.pAutoAudit @SchemaName = ‘dbo’,

    @TableName
= ‘db_objects’,

    @TableName
= ‘db_objects’,

    @ColumnNames
= ‘[type_desc],[create_date]’,

    @ColumnNames
= ‘[type_desc],[create_date]’,

   
@StrictUserContext = 1,

   
@StrictUserContext = 1,

    @LogSQL = 1,

    @LogSQL = 1,

    @BaseTableDDL
= 0,

    @BaseTableDDL
= 0,

    @LogInsert
= 1,

    @LogInsert
= 1,

    @LogUpdate
= 1,

    @LogUpdate
= 1,

    @LogDelete
= 1

    @LogDelete
= 1

 

 

 

 

 

 

图片 15

图片 16

 

 

本来也还有一对任何bug,如下所:

自然也还有部分别样bug,如下所:

 

 

EXEC
Audit.pAutoAudit @SchemaName = ‘dbo’,

EXEC
Audit.pAutoAudit @SchemaName = ‘dbo’,

    @TableName
= ‘db_objects’,

    @TableName
= ‘db_objects’,

    @ColumnNames
= ‘<all>’,

    @ColumnNames
= ‘<all>’,

   
@StrictUserContext = 1,

   
@StrictUserContext = 1,

    @LogSQL = 1,

    @LogSQL = 1,

    @BaseTableDDL
= 0,

    @BaseTableDDL
= 0,

    @LogInsert
= 1,

    @LogInsert
= 1,

    @LogUpdate
= 1,

    @LogUpdate
= 1,

    @LogDelete
= 1

    @LogDelete
= 1

 

 

图片 17

图片 18

 

 

 

 

其一都急需你调试代码,找出荒谬的因由,修改有关代码(首要都以动态生成SQL时,有一部分SQL语法错误,例如多了二个,等等),如今。已经自身一度发现并修改了该代码多处地点的小Bug。

这些都要求你调试代码,找出错误的缘由,修改相关代码(首要都以动态生成SQL时,有一对SQL语法错误,例如多了一个,等等),方今。已经自身一度意识并修改了该代码多处地方的小Bug。

 

 

最后跟踪审计,若是没有须要的话,最好不用开启,除非是为寻找定位一些题材,因为毕竟那些依旧有不少外加的性质开支、损耗,尤其是那种利用触发器来跟踪、审计,Auto奥迪(Audi)t也显著提出这一个会潜移默化属性:“Adding
Auto奥迪(Audi)t to your tables will impact performance.”

最后跟踪审计,假诺没有须要的话,最好不用开启,除非是为寻找定位一些题材,因为终究这一个照旧有过多万分的习性开销、损耗,特别是那种利用触发器来跟踪、审计,AutoAudit也鲜明指出那个会潜移默化属性:“Adding
AutoAudit to your tables will impact performance.”

 

 

 

 

参考资料:

参考资料:

 

 

https://autoaudit.codeplex.com/

https://autoaudit.codeplex.com/

http://sqlblog.com/blogs/paul_nielsen/archive/2007/01/15/codegen-to-create-fixed-audit-trail-triggers.aspx

http://sqlblog.com/blogs/paul_nielsen/archive/2007/01/15/codegen-to-create-fixed-audit-trail-triggers.aspx

 

 

相关文章