Database NHibernate:使用拦截器或触发器审核日志记录?

Database NHibernate:使用拦截器或触发器审核日志记录?,database,nhibernate,hibernate,orm,triggers,Database,Nhibernate,Hibernate,Orm,Triggers,触发器似乎是审计日志记录的简单解决方案。我为什么要使用拦截器 数据库可移植性是触发器的一个缺点 其他的是什么?另一个小问题是触发器执行任何DML。nHibernate使用受影响的行数来确定其许多操作是否成功。如果您在触发器内执行任何插入/更新等操作,则需要在触发器内启用NOCOUNT,以防止冒泡出那些错误的行数 这并不是说在任何方面都会妨碍触发器的工作,但我花了足够的时间来重构这个问题,我认为这是值得一提的。拦截器或EventListener是满足审计需求的一种简单、可移植的方法 另外,再也没有

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

  • 数据库可移植性是触发器的一个缺点

  • 其他的是什么?

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

    这并不是说在任何方面都会妨碍触发器的工作,但我花了足够的时间来重构这个问题,我认为这是值得一提的。拦截器或EventListener是满足审计需求的一种简单、可移植的方法


    另外,再也没有讨厌的T-SQL代码了……

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

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

  • 这样您就不会将自己绑定到特定的数据库。移植到不同的DBMS非常容易

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

  • 但所有这些都取决于上下文。如果有必要对特定记录进行所有更改是至关重要的,那么我认为HLGEM是正确的。触发器最适合处理这种类型的senario。

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


    Pablo Javier

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


    我认为数据库实际上只是应用程序的持久性区域。单个应用程序的。换言之,我不认为其他系统应该直接使用我的数据库,所以我认为审计是在数据库之外进行的(即不是用触发器)。

    可能想考虑这个类似的问题:奇怪,我发现测试触发器很容易。我也不觉得很难把它们写好。我坦率地承认这一点。你可能没有我那么糟糕。只有在数据库方面,我无法编写c#来拯救我的生命。t-SQL代码很难令人讨厌,它的功能非常好,而且比nHibernate好得多!如果nHibernate不能正确处理带有触发器的表,这就是不使用触发器的原因,因为触发器通常是作业的最佳工具,而不仅仅是用于审核。未在数据库中完成的审核是不完整的审核。它无法满足法律或监管对审计的需求,因为太多人很容易绕过审计。