为什么我们需要数据库表中的审计列?

时间:2010-05-04 04:59:31

标签: database database-design

我见过很多数据库设计在所有表格上都有以下审核列...

  • 创建者
  • 创建日期时间
  • 更新者
  • Upldated DateTime

从一个角度来看,我从以下视图中看到了表格......

  • 实体表:
    • 审核专栏的优秀候选人)
  • 参考表:
    • 审核列可能需要也可能不需要。在某些情况下,根本不需要上次更新信息,因为记录永远不会被修改。)
  • 参考数据表
    • 与国家/地区名称,实体状态等类似...可能不需要审核列,因为这些信息仅在系统安装期间创建,永远不会更改。

我看到很多设计师盲目地将所有审核专栏都放到了所有表格中,这种做法是否很好,如果是的话可能是什么原因......

我只是想知道,因为对我而言似乎不合逻辑。我很难弄清楚他们为什么这样设计数据库?我不是说他们错了或是对的,只是想知道为什么?

如果有其他审计模式或解决方案,您也可以建议我......

谢谢和问候

4 个答案:

答案 0 :(得分:5)

数据审核是许多业务系统所必需的内部控制(请参阅Sarbanes Oxley,了解原因)。它必须在数据库级别,以确保捕获所有更改,尤其是未经授权的更改。

即使使用查找表,未经授权的更改也可能会对您的系统造成严重破坏,因此了解谁进行了更改以及何时进行更改非常重要。什么时候特别重要,因为它有助于dbas知道在多大程度上获取备份以便意外或恶意地更改信息。

我们认为我们所有的员工都值得信赖,但许多盗窃的个人数据和破坏公司数据的恶意变更来自内部资源(这就是为什么让许多心怀不满的员工感到危险)几乎所有欺诈然而,大多数程序员似乎认为他们只需要防范外部威胁。

当然,您仍然会有一些人可以进行未经授权的更改,但您无法阻止系统管理员执行此操作。但至少通过审计可以限制数据损坏的可能性(在雇用dbas时要特别小心,并且不允许在数据库服务器上使用其他任何管理员权限。)

答案 1 :(得分:2)

这些列是为了DBA和数据库开发人员的利益。他们只是提供了一个快速的机制来回答诸如“这个记录何时发生变化?”之类的问题。 “谁改变了?”它们不够坚固或细粒度足以满足SOX,HIPAA或其他任何要求。

在每张桌子上放置这些列会更容易。所有数据都可以更改,因此了解更改发生的时间非常有用,尤其是在数据不应更改的情况下。通过使用数据字典生成脚本,可以自动化添加它们的过程。

优良作法是通过触发器或某些类似机制独立于应用程序填充这些列。这些列是元数据,应用程序不应该真正意识到它们。

依靠完整的审计跟踪来提供此功能通常不是一种选择。为合规目的而收集的审计数据通常具有受限访问权限,并且实际上可以存储在单独的物理位置中。

答案 2 :(得分:1)

许多应用程序是使用某种OOP语言开发的,其中通常有类似 BusinessObject 的类,其中包含通常感知的有用信息,例如审计字段。并非所有的子类化实体都需要它,但如果它们存在,它就在那里。由于数据库的开销很小,并且客户端可能会根据审计字段请求另一个奇怪的统计数据,因此最好让它们在周围而不是完全拥有它们。如果某些东西代表一个静态的信息列表,例如国家名称,我通常不会将它放在数据库中 - 枚举数据类型只是为了这个目的而创建的。

答案 3 :(得分:0)

我偶然遇到了这个帖子,因为今天早上脑子里出现了同样的问题。每个答案都有所帮助,我绝对同意你们所有人的观点。无可否认,保护业务数据和交易数据。而不是那样,作者对某些配置或静态数据的审计字段感到怀疑。

用户无法更新此类配置数据。通常它们也可以放在其他地方,如属性,配置文件甚至硬编码常量。当然,在这些地方放置配置数据可能是糟糕的设计或风格,但从审计的角度来看,它们是否重要?此外,如果这些数据可由用户更新,那么唯一可以更新它的是dba或黑客。真正恶意的dba或黑客在违反法律之前就已经知道了法律,他们确实找到了规避法律的方法。

对我而言,问题与贵公司的环境有关。贵公司是否具有跟踪每一点微小信息的文化?贵公司是否经常严格执行纪律,监督或审计?将这些审核字段用于非用户数据只是为了让他们满意,而不是其他任何目的。