客户端使用的数据库历史

时间:2009-03-17 18:09:55

标签: vb.net oracle database-design

我正在试图找出在数据库上创建历史记录的最佳方法,以跟踪已完成的任何插入/删除/更新。历史数据需要编码到前端,因为它将由用户使用。创建“历史表”(用于存储历史记录的每个表的副本)不是一种好方法,因为数据分布在多个表中。

此时,我最好的想法是创建一些历史表,表格将反映我想要向用户显示的输出。每当对特定表进行更改时,我都会使用数据更新此历史记录表。

我正在试图弄清楚最好的方法是什么。任何建议将不胜感激。

我正在使用Oracle + VB.NET

4 个答案:

答案 0 :(得分:2)

我非常成功地使用了一个模型,其中每个表都有一个审计副本 - 在第一个表上有一些附加字段(时间戳,用户ID,操作类型)和3个触发器用于插入/更新/删除。
我认为这是处理这种情况的一种非常好的方法,因为表和触发器可以从模型生成,从管理角度来看几乎没有开销。 应用程序可以使用这些表向用户显示审计历史记录(只读)。

答案 1 :(得分:0)

我们的系统中有这个要求。我们添加了两个表,一个标题,一个名为AuditRow和AuditField的详细信息。 AuditRow在任何其他表中每行更改一行,并且AuditField包含每列更改一行的旧值和新值。

我们在每个表上都有一个触发器,它在每次插入/更新/删除时写入标题行(AuditRow)和所需的详细信息行(每个更改的列一个)。这个系统确实依赖于我们在每个可以唯一表示行的表上有一个guid的事实。不必是“业务”或“主要”密钥,但它是该行的唯一标识符,因此我们可以在审计表中识别它。像冠军一样工作。矫枉过正?或许,但我们从未遇到过审计员的问题。 : - )

是的,Audit表是迄今为止系统中最大的表。

答案 2 :(得分:0)

如果您有幸使用Oracle 11g,您还可以使用Flashback Data Archive

答案 3 :(得分:0)

就个人而言,我会远离触发器。在调试时,它们可能是一场噩梦,如果你想扩展,它们不一定是最好的。

如果您使用PL / SQL API执行INSERT / UPDATE / DELETE,则可以通过简单的设计转换来管理它,而无需(预先)历史表。

您只需要2个额外的列,DATE_FROM和DATE_THRU。当记录被INSERT时,DATE_THRU保持为NULL。如果该记录是UPDATEd或DELETEd,则通过将DATE_THRU设为当前日期/时间(SYSDATE)来“结束日期”记录。显示历史记录就像从表中选择一样简单,DATE_THRU为NULL的一条记录将是您当前或活动的记录。

现在,如果您期望进行大量更改,那么将旧记录注销到历史记录表会更好,但我仍然不会使用触发器管理它,我会使用API​​。

希望有所帮助。