我发现了几个关于此的讨论主题 - 但没有任何内容在一个主题下对所有三种机制进行比较。
所以这是我的问题......
我需要审核数据库更改 - 将\ updates \ deletes插入业务对象。
我可以想到三种方法来做到这一点
1)DB触发器
2)Hibernate拦截器
3)Spring AOP
(这个问题特定于Spring \ Hibernate \ RDBMS-我想这对java \ c#或hibernate \ nhibernate-是中立的 - 但如果你的答案依赖于C ++或Java或hibernate的具体实现 - 请指明)< / p>
选择其中一种策略有哪些优缺点?
我不是要求实施细节.-这是一个设计讨论。
我希望我们可以将其作为社区维基的一部分
答案 0 :(得分:4)
我只能谈论触发器和NHibernate,因为我不知道应该使用AOP。
一如既往地取决于你最重要的事情。
数据库触发器
NHibernate拦截器/事件
答案 1 :(得分:3)
我知道这不是与问题100%相关,但它确实增加了新选项的价值。
还有两种方法可以审核正在发生的事情。
读取事务日志:如果数据库处于完全恢复模式,则有关INSERT,UPDATE,DELETE和DDL语句的所有详细信息都将记录到事务日志中。
问题是它阅读起来非常复杂,因为它本身不受支持,并且您需要第三方交易日志阅读器,例如ApexSQL Log或SQL Log Rescue(后者是免费的,但只支持sql 2000)。
此方法的优点是,除了将数据库置于完全恢复模式之外,您无需进行任何更改。
SQL Server跟踪:跟踪将捕获跟踪文件中的所有内容,包括某些合规性方案可能还需要的select语句。缺点是跟踪是需要解析和组织的文本文件。
答案 2 :(得分:2)
我无法想到没有使用数据库触发器来审核数据库更改的任何充分理由。插入,更新和删除可能会从各种来源命中数据库 - 触发器将捕获所有这些; Hibernate等不会。
答案 3 :(得分:0)
当你考虑审计时我会叮叮当当,你需要考虑它的用途。首先,要记录谁改变了什么和改变了什么以便你可以退出不好的改变,你可以发现系统的问题(我们可以看到几个不同的应用程序中的哪一个产生了变化,这有助于快速识别哪一个被破坏)因此,您可以确定谁进行了更改。在检测欺诈方面,最后一点非常重要。如果您从用户界面执行所有操作,您将永远不会看到提交欺诈的用户更改后端中的数据以自行检查。如果您从界面执行所有操作,可能必须在表单级别设置权限,从而为欺诈开始打开大门。如果您从界面执行所有操作,您将不知道哪个心怀不满的员工删除了整个用户表中的纯烦恼值。如果您从前端执行所有操作,您将不知道哪个不称职的dba意外地将所有客户订单更新到同一客户。我不能支持使用除审计触发器之外的任何东西,因为你失去了一开始就需要审计的大部分原因。
答案 4 :(得分:0)
使用Hibernate拦截器执行审计日志存在严重缺陷。我对被推荐这种方法的博客数量感到震惊,但没有指出其最明显的缺陷 - 拦截器还有一个新事务来记录审计。这意味着您可以成功保存主事务并导致系统崩溃,无法记录审计事务!
答案 5 :(得分:0)
我现在遇到的一个老问题。还有一个选项可供选择,那就是Envers,它可以从版本3.6开始随hibernate一起提供..