如何在数据库中保留修改的历史细节(审计跟踪)?

时间:2010-03-27 19:54:32

标签: database database-design postgresql audit

我是J2EE开发人员&我们正在使用带有PostgreSQL数据库的hibernate映射。

我们必须跟踪数据库中发生的任何变化,换句话说,所有以前的变化和应保存任何字段的当前值。每个字段可以是任何类型(bytea,int,char ...)

使用简单的表格很容易,但我们的对象图表更难处理。

因此,从UML的角度来看,我们有一个对象的图表,用于存储在数据库中的每个更改和用户。

任何想法或模式如何做到这一点?

2 个答案:

答案 0 :(得分:1)

执行此操作的常用方法是存储对象的版本。

如果要为要存储审计跟踪的每个表添加“版本”和“已删除”字段,请遵循以下规则,而不是执行常规更新和删除:

  • 插入 - 将版本号设置为0并正常插入。
  • 更新 - 增加版本号并改为插入。
  • 删除 - 增加版本号,将删除的字段设置为true,然后执行插入操作。
  • 检索 - 获取具有最高版本号的记录并将其返回。

如果您遵循此模式,则每次更新时都会创建新记录而不是覆盖旧数据,因此您始终可以追踪并查看所有旧对象。

对于对象图,这将完全相同,只需将新字段添加到对象图中的每个表,并按上述方法处理每个表的每个插入/更新/删除。

如果您需要知道哪个用户进行了修改,您只需添加“ModifiedBy”字段。

(您可以在DA层代码中执行此处理,或者如果您愿意,可以使用数据库触发器捕获更新/删除/检索调用,并按照规则重新处理它们。)

显然,您需要考虑空间要求,因为每次更新都会产生全新的记录。如果您的应用程序更新,您将生成大量数据。通常还包括“上次修改时间”字段,以便您可以离线处理数据库并删除早于所需数据的数据。

答案 1 :(得分:1)

当前的RDBMS实现在处理时态数据方面不是很好。这是通过触发器维护单独的日志记录表的常见方法之一。 (另一个是审计跟踪经常对常规数据有不同的用例,将它们放在不同的表中可以更容易地管理对它们的访问)。 Oracle在Total Recall product中隐藏了管道工作做得非常顺利,但作为Oracle,它为此收费为$$$。

Scott Bailey在PostgreSQL上发表了关于时态数据的演讲。唉它现在不会帮助你,但似乎计划用于8.5和8.6的某些功能将能够透明地存储与时间相关的数据。 Find out more