Database 实现审计跟踪-Spring AOP与Hibernate拦截器与DB触发器

Database 实现审计跟踪-Spring AOP与Hibernate拦截器与DB触发器,database,hibernate,audit,spring-aop,Database,Hibernate,Audit,Spring Aop,我在这个问题上找到了几个讨论线索——但没有任何东西能够在一个线程下对所有三种机制进行比较 这是我的问题 我需要审核对业务对象的DB更改-插入\更新\删除 我可以想出三种方法 1) 数据库触发器 2) 休眠拦截器 3) 春季AOP (这个问题是针对Spring Hibernate \RDBMS的)——我想这是对java java C++或Hibernate \nHibernate的中立——但是如果你的答案依赖于C++或Java或者具体的Hibernate的实现-请注明) 选择其中一种策略的利弊是什

我在这个问题上找到了几个讨论线索——但没有任何东西能够在一个线程下对所有三种机制进行比较

这是我的问题

我需要审核对业务对象的DB更改-插入\更新\删除

我可以想出三种方法

1) 数据库触发器

2) 休眠拦截器

3) 春季AOP

(这个问题是针对Spring Hibernate \RDBMS的)——我想这是对java java C++或Hibernate \nHibernate的中立——但是如果你的答案依赖于C++或Java或者具体的Hibernate的实现-请注明)

选择其中一种策略的利弊是什么

我不是在问实施细节-这是设计讨论


我希望我们能将此作为社区wiki的一部分来实现

我想不出任何好的理由不使用数据库触发器来审核对数据库的更改。插入、更新和删除可能会从各种来源影响数据库-触发器将捕获所有这些;Hibernate等不会。

我只能谈论触发器和NHibernate,因为我对tSpring AOP知之甚少

和往常一样,这取决于什么对你最重要

数据库触发器

  • 你很快
  • 始终调用,即使是从本机SQL、脚本或外部应用程序调用
  • 在NH不知道的数据库中写入数据。它将在当前会话中丢失。(可能导致意外结果)
  • 通常对您的会话一无所知(比如:登录名)
NHibernate拦截器/事件

  • 不是DBMS特有的
  • 允许您轻松访问业务信息,如用户会话、客户机名称、某些计算或解释、本地化等
  • 允许您进行声明性配置,如实体上的属性,这些属性定义是否需要记录实体以及如何记录实体
  • 允许您关闭日志记录,这对于升级、导入和非用户触发的特殊操作可能很重要
  • 允许您查看业务模型的实体视图。您可能更接近用户的观点

  • 当你考虑审计时,你需要考虑它是什么。首先,要有一个记录,记录谁更改了什么,更改了什么,这样你就可以撤销错误的更改,你可以识别系统的问题(我们可以看到几个不同的应用程序中的哪一个导致了更改,这有助于快速识别哪一个被破坏),这样你就可以识别是谁做出了更改。在检测欺诈时,最后一种方法非常关键。如果您从用户界面执行所有操作,您将永远不会看到用户通过更改后端数据来为自己写支票进行欺诈。如果您从界面执行所有操作,则很可能必须在选项卡级别设置权限,从而为欺诈打开了大门。如果您从界面执行所有操作,您将不知道哪个不满意的员工删除了整个用户表的纯烦恼值。如果您从前端开始做所有事情,您将不知道哪个不称职的dba意外地将所有客户订单更新到了同一客户。我不支持在审计中使用触发器以外的任何东西,因为您失去了一部分首先需要审计的原因。

    使用Hibernate拦截器执行审计日志存在严重缺陷。很多博客推荐这种方法,却没有指出它最明显的缺陷——拦截器必须使用一个新的事务来记录审计,这让我感到震惊。这意味着您可以成功保存主事务,并导致系统崩溃,无法记录审核事务

    我现在偶然遇到了一个老问题。还有一个选项可用,那就是Envers,它从3.6版开始与hibernate一起提供。

    我知道这与这个问题没有100%的关系,但它确实增加了新选项的价值

    还有两种方法可以审核正在发生的事情

    读取事务日志:若数据库处于完全恢复模式,则有关INSERT、UPDATE、DELETE和DDL语句的所有详细信息都将记录到事务日志中

    问题是它的读取非常复杂,因为本机不支持它,并且您需要一个第三方事务日志读取器,如或(后者是免费的,但只支持sql 2000)

    这种方法的优点是,除了将数据库置于完全恢复模式之外,您实际上不需要进行任何更改


    SQL Server跟踪:跟踪将捕获跟踪文件中的所有内容,包括select语句,这些语句在某些法规遵从性场景中也可能需要。缺点是跟踪是需要分析和组织的文本文件。

    我同意你的看法,确保数据库上的所有活动都经过审核的唯一方法是在数据库级别进行审核。如果你想切换数据库,该怎么办?重写所有触发器?@Icarus:如果你切换数据库,这将是你需要做的许多事情之一,是的。事实上,企业不会频繁切换数据库。数据库触发器只知道日期和数据库登录名。当应用程序通过单个登录连接时,只留下日期(以及数据更改)。只有日期的价值取决于您正在执行的审计类型。还有另一种选择:至少有些数据库具有相同的审计功能。赞成:非常依赖,可能是高性能;缺点:高度特定于供应商,您肯定不希望日志事务崩溃导致主事务失败。我想您会的。如果没有,那么从审计员的角度来看,您的审计日志就不再是系统中实际发生或未发生的事情的可靠“真相”。仅供参考:我们实现了一个将hibernate打包的系统