我正在试图找出在数据库上创建历史记录的最佳方法,以跟踪已完成的任何插入/删除/更新。历史数据需要编码到前端,因为它将由用户使用。创建“历史表”(用于存储历史记录的每个表的副本)不是一种好方法,因为数据分布在多个表中。
此时,我最好的想法是创建一些历史表,表格将反映我想要向用户显示的输出。每当对特定表进行更改时,我都会使用数据更新此历史记录表。
我正在试图弄清楚最好的方法是什么。任何建议将不胜感激。
我正在使用Oracle + VB.NET
答案 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。
希望有所帮助。