[英]Is this the best approach to creating an audit trail?
我正在尝试创建一些功能,以便对给定用户表单中的数据如何随时间变化进行审计跟踪,并在该页面的底部进行过时的审计。 例如:
02/04/09 21:49名称由“Tom”改为“Chris”。
我这样做是通过在会话中以数据的当前格式存储数据,然后在保存时检查存储的数据是否存在任何差异。 如果有,我将数据存储在名为history的表中最新编辑之前的数据,并将新值存储在当前用户表中。
这是最好的方法吗?
我不确定是否有一个“最佳方法”,需要考虑很多变量,包括你的开发路径有多远。
通过基于代码和数据库触发器的审计解决方案,我在下面列出了一些评论; 我希望你能看到你现在所处的位置(在开发方面)会影响这些问题:
一个建议; 这在数据库触发器中相对容易。 在这种情况下,您永远不必担心运行更新的代码是否记得添加历史记录。
我一直是使用一个表而不是将其分解为“活动”表和“历史”表的粉丝。 我在这些表上放了4列,所有时间戳:创建,删除,开始,结束。 “创建”和“删除”是相当不言自明的。 “开始”和“结束”时间戳是指记录实际上是“活动”记录的时间戳。 当前活动的记录将具有now()
之前的“开始”时间和NULL
“结束”时间。 通过分离“创建”和“开始”时间,您可以安排将来进行更改。
与双表设计相反,此设计允许您轻松编写将自动操作正确数据的查询。 假设您的表格随时间存储税率...您不希望在计算中使用税率的所有查询都具有在处理旧发票时决定在历史记录表中查找内容的额外复杂性,示例...您可以查询在一个查询中创建发票时生效的税率,无论它是否是当前税率。
这个想法本来不是我的(虽然我在阅读之前就自己重新发明了这个粗略的想法)......你可以在这本在线书中找到它的详细讨论。
会话参与让我有点小心(你确定当两个用户同时处理相同的数据时你正确处理它吗?),但总的来说,保持历史表是正确的。
我还会考虑插入或更新时的数据库触发器,以将更改详细信息(who,when,what,value,value after)记录到单独的审计表中。 这样你就知道,即使你的应用程序使用数据库直接更改了数据,它仍然会被拾取。
您可能还想要做一些事情来检测数据是否在您的应用程序中更改,例如计算记录的哈希值或crc并将其存储在某个字段中,然后在读取数据时进行检查。
我认为您的提案将涉及编写大量代码/元数据以实现对象/记录的比较,以便您进行业务级审计。
或者,数据库触发器可能无法为您提供足够高级别的视图。 如果您不经常使用审计来重新创建业务意义的努力是可以接受的,那么这可能是可以接受的。
对于AOP(Aspects)来说,这似乎也是一个很好的应用程序,您可以在对象模型上使用反射来转储有意义的内容而无需大量元数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.