Django AuditTrail与Reversion对比

18

我正在开发一个新的Web应用程序,需要将任何更改存储到数据库中的审计表中。审计表的目的是为了在实际物理审计中确定发生了什么情况,谁编辑了什么以及在例如复杂计算时数据库的状态是什么。

因此,大多数情况下,审计表都将被写入而不是读取。虽然有时可能会生成报告。

我已经寻找可用的解决方案:

  1. AuditTrail - 简单易用,这就是我倾向于它的原因,我可以理解它的单文件代码。
  2. Reversion - 看起来使用起来很简单,但不确定如果需要修改它会有多容易。
  3. rcsField 看起来非常复杂,对我的需求来说太过繁琐。

我还没有尝试过这些解决方案,所以我想知道一些真正的经验和哪一个我应该使用。例如:哪一个更快、占用更少的空间、容易扩展和维护?


2
AuditTrailHistoricalRecords方法的最新且受支持的实现是django-simple-history - Ivan Kharlamov
3个回答

8
个人而言,我更喜欢在数据库中创建审计表,并通过触发器填充,以便存储任何更改,即使是从查询窗口的临时查询也会被记录。我永远不会考虑那些不基于数据库本身的审计解决方案。这很重要,因为那些对数据库进行恶意更改或者欺诈行为的人通常不会通过 Web 接口进行操作,而是直接通过后端进行操作。比起外部黑客,更多这样的事情发生在不满意或者贪污的员工身上。如果您已经在使用 ORM,则您的数据处于风险之中,因为权限是基于表级别而不是应该属于 sp 级别。因此,捕获数据的任何可能更改变得更加重要,而不仅仅是从 GUI 中更改的内容。我们有一个动态过程来创建审计表,每当向数据库添加新表时就会运行它。由于我们的审计表只填充更改而不是整个记录,所以我们不需要在每次添加字段时都更改它们。
此外,在评估可能的解决方案时,请确保考虑如何将数据恢复以撤消特定更改的难度。一旦您拥有审计表,您会发现这是您最需要从中做的事情之一。还要考虑在数据库模式更改时维护信息的难度。
仅仅因为某个解决方案似乎最容易理解而选择它,通常并不是一个好主意。在满足要求、安全性等之后,这应该是您选择标准中最低的一个。

3
我选择了软件解决方案而不是数据库解决方案(所以现在我正在寻找一个可维护的方案)。B方案不能轻易地适应应用程序状态。 关于安全性,我认为如果一个人可以访问数据库并且想要进行欺诈,那么他为什么不会删除这样的数据库审计触发器或者不更改审计表本身呢?除非它们被存储在第三个物理位置并具有重​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​重​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​最的安全性。 - Anurag Uniyal

3

我无法为它们提供真实的使用经验,但是我想做出一些观察。

如果您所说的AuditTrail指的是Django wiki上的AuditTrail,那么我认为您应该看一下同一作者(Marty Alchin,也称@gulopine)在他的书Pro Django中开发的HistoricalRecords。它应该能更好地与Django 1.x配合使用。

这是我将在即将到来的项目中采用的方法,不是因为从技术角度而言它必然优于其他方法,而是因为它符合该应用程序对审计跟踪的“现实世界”期望。


是的,AudtiTrail指的是Django维基上的AuditTrail, 那么HistoricalRecords需要买书还是代码可用? - Anurag Uniyal
他的其他项目都在网上,但是我甚至在http://prodjango.com/上都找不到那个特定的代码。 - Van Gale
6
如果有其他人像我一样看到这个问题,需要注意的是HistoricalRecords已经扩展了Marty Alchin的许可,并且现在作为django-simple-history可用:https://bitbucket.org/q/django-simple-history - Trey Hunner

2
正如我在我的问题中所述,rcField似乎对我的需求过于复杂,我的需求很简单,即存储任何对我的表格进行的更改,并可能稍后返回这些更改以生成一些报告。
因此,我测试了AuditTrail和Reversion。Reversion似乎是一个更好的全面应用程序,具有许多功能(我不需要),而且据我所知,它会将数据保存在单个表格中,格式为XML或YAML,我认为
  1. 这将在单个表中生成太多的数据
  2. 要阅读该数据,我可能无法使用已经存在的数据库工具。
在这方面,AuditTrail胜出,因为它为每个表生成相应的审计表,因此更改可以轻松跟踪,每个表的数据较少,可以轻松操作并用于报告生成。
因此,我选择使用AuditTrail。

你看过这个类FullHistory吗:http://www.djangosnippets.org/snippets/1234/?我开始观察你的问题,并且还没有找到最好的解决方案。你对AuditTrail有什么问题吗? - ramusus
我还没有研究过FullHistory,但如果它能够工作,那将是一个非常简单的解决方案。目前我还没有在生产中使用auditTrail,但初步测试似乎表明它可以正常工作。 - Anurag Uniyal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接