【发布时间】:2010-10-09 15:21:17
【问题描述】:
触发器似乎是审计日志记录的简单解决方案。为什么要使用拦截器?
- 数据库可移植性是触发器之一...
还有什么?
【问题讨论】:
-
可能要考虑这个类似的问题:stackoverflow.com/questions/15917/…
标签: database nhibernate hibernate orm triggers
触发器似乎是审计日志记录的简单解决方案。为什么要使用拦截器?
还有什么?
【问题讨论】:
标签: database nhibernate hibernate orm triggers
使用除触发器之外的任何东西的缺点是并非所有数据更改都可能通过 GUI 发生,因此可能不会被记录。您必须考虑从许多来源更改数据库,包括数据导入和来自查询窗口的基于集合的查询(例如,当有人被要求将所有价格更新 10% 时)。如果您使用另一种方法,您最好确保它可以捕获任何可以更改数据的方式。如果您完全使用动态 sql,那么您的所有表都对用户开放,可以直接在数据库中进行更改,包括旨在从公司窃取的欺诈性更改。实施欺诈的用户是审计触发器旨在捕获的关键内容之一。如果您认为您的审计解决方案没问题,因为它从用户界面捕获了所有内容,并且它需要捕获所有内容,那么您就大错特错了。我不知道拦截器是如何工作的,但是在您认为该解决方案将起作用之前,您最好使用查询窗口中的 SSIS(或 DTS)导入和查询进行测试。此外,如果它仅在 GUI 中工作,请记住可能有多个 GUI 连接到数据库。
【讨论】:
我认为使用拦截器的原因有两个:
这样您就不会将自己绑定到特定的数据库。移植到不同的 DBMS 要容易得多。
这样您的域模型就不会渗入代码的其他区域。即数据库需要知道记录是否已更改。
但这一切都取决于上下文。如果必须对特定记录进行所有更改,那么我认为 HLGEM 是正确的。触发器最适合处理这种类型的场景。
【讨论】:
我同意 HLGEM。 除了具有触发器和 DBMS 的可移植性优势之外,一个很好的替代方法是使用一些审计工具: 给定一个审计计划:为适当的 DBMS 生成触发器
巴勃罗·哈维尔
【讨论】:
另一个小问题是触发器执行任何 DML。 nHibernate 使用受影响的行数来确定其许多操作是否成功。如果您正在执行任何插入/更新/等。在触发器内部,那么您需要在触发器内部打开 NOCOUNT 以防止那些错误的行数冒泡。
无论如何,这并不是说这会阻止您使触发器工作,但我已经花了足够的时间来重构这个问题,我认为这值得一提。拦截器或 EventListener 是满足审计要求的一种简单、可移植的方式。
另外,不再有讨厌的 T-SQL 代码...
【讨论】:
触发器不容易测试,而且它们实际上很难正确编写。如果您的审计数据要供业务用户使用,通常很难将数据库行级操作转换回域模型。
我认为数据库实际上只是应用程序的持久性区域。单个应用程序。换句话说,我认为其他系统不应该直接使用我的数据库,因此我认为审计应该在数据库之外完成(即不使用触发器)。
【讨论】: