专题如何审计表最近已如雨后春笋般出现在我们的讨论...所以我喜欢你的意见,对什么是最好的方式方法这一点。我们有两者的混合方法(这是不好的)在数据库中,每个先前DBA做了什么他/她认为正确的方式。因此,我们需要改变他们遵循任何一个模型。

CREATE TABLE dbo.Sample(
Name VARCHAR(20),
...
...
Created_By VARCHAR(20),
Created_On DATETIME,
Modified_By VARCHAR(20),
Modified_On DATETIME
)

CREATE TABLE dbo.Audit_Sample(
Name VARCHAR(20),
...
...
Created_By VARCHAR(20),
Created_On DATETIME,
Modified_By VARCHAR(20),
Modified_On DATETIME
Audit_Type VARCHAR(1)  NOT NULL
Audited_Created_On DATETIME
Audit_Created_By VARCHAR(50)
)

办法1: 存储,在审计表,只有那些记录替换或删除从主要表(使用系统表中删除)。因此,对于每一个更新和删除主要的表中,记录就是被替换插入审计表与'Audit_Type列为枯萎'U'(更新)或'D'(删除)

插入不经过审计。当前版本的任何记录你总是查询的主要表。和您的查询审计表。

赞成:似乎包含仅适,储存在以前版本的记录 缺点:如果你需要知道的历史的一个特别的记录,需要加入的审计表的主要表。

Appraoch2: 存储,在审计表中,每一记录进入主要表(使用系统表中插入).

每个记录,插入/更新/删除的主要表也存在审计表。所以当你插入一个新的记录也是插入审计表。当更新,新的版本(从插入)表是存储在审计表。当删除,旧版本(从中删除)表是存储在审计表。

赞成:如果你需要知道的历史的一个特别的记录,你已经一切都在一个位置。

虽然我并没有列出所有的他们在这里,每个方法都有其优点和缺点?

有帮助吗?

解决方案

我会去:

Appraoch2: 存储,在审计表中,每一记录进入主表 (使用系统表中插入).

是一个更多的行每项真的要杀死数据库?这样你有完整的历史记录在一起。

如果你清了排(一范围内所有年龄超过X日)你仍然可以告诉我们,如果事情已经改变或不:

  • 如果一审计行的存在(不清),你可以看到,如果行问题的改变。
  • 如果没有审计行存在的项目(所有被清除)没有什么变化(因为任何改变写入审计表,其中包括完全的新项目)

如果你去Appraoch1:和清除出的范围内,它将是困难(需要记住的清除的日期)以告诉新插入与那些在那里的所有行被清除。

其他提示

第三个方法我们用很多是仅仅审计的有趣列和节省'新的'和'旧'价值,在各行。

所以如果你有你的"姓名"一栏中,审计表会"name_old"和"name_new".

在插入触发,"name_old"设置空/空,这取决于你的喜好和"name_new"设置插入。在更新触发,"name_old"设定删除"name_new"从插入 在删除触发,"name_old"设定删除"new_name"对空/空。

(或使用充分加入和一个触发适用于所有情况)

为VARCHAR fields,这可能看起来不像是个好主意,但是对于整数、时间等它提供的利益,这是非常容易看出差别的更新。

I.e。如果你有一个数量域在你的真实表和更新它从5至7个,你已经在审计表:

quantity_old  quantity_new
           5             7

很容易就可以计算的数量增加了2个在特定的时间。

如果你有独立的行审计表,你将有参加一行,用"下一个"计算出差别的-这可能是棘手的,在某些情况下...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top