审计触发器:使用的插入或删除的系统表
-
16-09-2019 - |
题
专题如何审计表最近已如雨后春笋般出现在我们的讨论...所以我喜欢你的意见,对什么是最好的方式方法这一点。我们有两者的混合方法(这是不好的)在数据库中,每个先前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个在特定的时间。
如果你有独立的行审计表,你将有参加一行,用"下一个"计算出差别的-这可能是棘手的,在某些情况下...