【问题标题】:NHibernate: Audit logging using Interceptor or Triggers?NHibernate:使用拦截器或触发器审计日志记录?
【发布时间】:2010-10-09 15:21:17
【问题描述】:

触发器似乎是审计日志记录的简单解决方案。为什么要使用拦截器?

  1. 数据库可移植性是触发器之一...

还有什么?

【问题讨论】:

标签: database nhibernate hibernate orm triggers


【解决方案1】:

使用除触发器之外的任何东西的缺点是并非所有数据更改都可能通过 GUI 发生,因此可能不会被记录。您必须考虑从许多来源更改数据库,包括数据导入和来自查询窗口的基于集合的查询(例如,当有人被要求将所有价格更新 10% 时)。如果您使用另一种方法,您最好确保它可以捕获任何可以更改数据的方式。如果您完全使用动态 sql,那么您的所有表都对用户开放,可以直接在数据库中进行更改,包括旨在从公司窃取的欺诈性更改。实施欺诈的用户是审计触发器旨在捕获的关键内容之一。如果您认为您的审计解决方案没问题,因为它从用户界面捕获了所有内容,并且它需要捕获所有内容,那么您就大错特错了。我不知道拦截器是如何工作的,但是在您认为该解决方案将起作用之前,您最好使用查询窗口中的 SSIS(或 DTS)导入和查询进行测试。此外,如果它仅在 GUI 中工作,请记住可能有多个 GUI 连接到数据库。

【讨论】:

    【解决方案2】:

    我认为使用拦截器的原因有两个:

    1. 这样您就不会将自己绑定到特定的数据库。移植到不同的 DBMS 要容易得多。

    2. 这样您的域模型就不会渗入代码的其他区域。即数据库需要知道记录是否已更改。

    但这一切都取决于上下文。如果必须对特定记录进行所有更改,那么我认为 HLGEM 是正确的。触发器最适合处理这种类型的场景。

    【讨论】:

      【解决方案3】:

      我同意 HLGEM。 除了具有触发器和 DBMS 的可移植性优势之外,一个很好的替代方法是使用一些审计工具: 给定一个审计计划:为适当的 DBMS 生成触发器

      巴勃罗·哈维尔

      【讨论】:

        【解决方案4】:

        另一个小问题是触发器执行任何 DML。 nHibernate 使用受影响的行数来确定其许多操作是否成功。如果您正在执行任何插入/更新/等。在触发器内部,那么您需要在触发器内部打开 NOCOUNT 以防止那些错误的行数冒泡。

        无论如何,这并不是说这会阻止您使触发器工作,但我已经花了足够的时间来重构这个问题,我认为这值得一提。拦截器或 EventListener 是满足审计要求的一种简单、可移植的方式。

        另外,不再有讨厌的 T-SQL 代码...

        【讨论】:

        • T-SQL 代码几乎不讨厌,它的功能很棒,而且比 nHibernate 好得多!如果 nHibernate 不能正确处理带有触发器的表,这是不使用它的原因,因为触发器通常是完成这项工作的最佳工具,而不仅仅是用于审计。未在数据库上进行的审计是不完整的审计。它无法满足审计的法律或监管需求,因为太多人很容易绕过审计。
        【解决方案5】:

        触发器不容易测试,而且它们实际上很难正确编写。如果您的审计数据要供业务用户使用,通常很难将数据库行级操作转换回域模型。

        我认为数据库实际上只是应用程序的持久性区域。单个应用程序。换句话说,我认为其他系统不应该直接使用我的数据库,因此我认为审计应该在数据库之外完成(即不使用触发器)。

        【讨论】:

        • 奇怪,我发现测试触发器很容易。我也不觉得很难正确地编写它们。
        • 我承认I'm a terrible programmer。你可能没有我那么可怕。
        • 只做数据库,不能写c#救命。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-16
        • 2010-10-27
        • 2010-09-29
        • 2017-06-26
        • 1970-01-01
        相关资源
        最近更新 更多