关于sql server:NHibernate和SqlServer中的数据审核

关于sql server:NHibernate和SqlServer中的数据审核

Data Auditing in NHibernate and SqlServer

我在一个项目上使用NHibernate,我需要进行数据审核。 我在codeproject上找到了这篇文章,该文章讨论了IInterceptor接口。

您首选的审计数据方式是什么? 您是否使用数据库触发器? 您是否使用与本文讨论的内容类似的内容?


对于NHibernate 2.0,您还应该查看事件监听器。这些是IInterceptor接口的演变,我们成功地将它们用于审核。


[编辑]

NH2.0发布后,请按照以下建议查看事件监听器。我的答案已经过时了。

建议使用IInterceptor以非侵入方式修改处于休眠状态的任何数据。对于无需知道您的应用程序代码的数据解密/加密,它也很有用。

数据库上的触发器将日志记录(应用程序关注点)的责任移到了DBMS层,这有效地将您的日志记录解决方案与数据库平台联系在一起。通过将审计机制封装在持久层中,您可以保持平台独立性和代码可移植性。

我在生产代码中使用拦截器,以在一些大型系统中提供审核。


我知道这是一个老问题。但是我想根据NH 2.0中的新事件系统来回答这个问题。对于侦听类功能,事件侦听器比侦听器更好。 Ayende上个月在他的博客上写了一个很好的例子。这是他博客文章的网址-

ayende.com/Blog/archive/2009/04/29/nhibernate-ipreupdateeventlistener-amp-ipreinserteventlistener.aspx


我确实喜欢上面提到的Interceptor方法,并将其用于我当前正在研究的项目中。

但是,值得强调的一个明显的缺点是,这种方法只会审核通过应用程序进行的数据更改。您可能需要不时执行的任何直接数据修改(例如临时SQL脚本)(始终会发生!)将不会被审计,除非您记得同时执行审计表插入。


我更喜欢您提到的CodeProject方法。

数据库触发器的一个问题是,它别无选择,只能将Integrated Security与ActiveDirectory结合使用来访问SQL Server。这样做的原因是您的连接应该继承触发连接的用户的身份。如果您的应用程序使用命名的" sa"帐户或其他用户帐户,则"用户"字段将仅反映" sa"。

可以通过为应用程序的每个用户创建一个命名的SQL Server帐户来覆盖它,但是,例如,对于非Intranet,面向公众的Web应用程序,这是不切实际的。


作为一种完全不同的方法,您可以在存储库中使用装饰器模式。

说我有

1
2
3
4
public interface IRepository<EntityType> where EntityType:IAuditably
{
    public void Save(EntityType entity);
}

然后,我们将拥有NHibernateRepository:

1
2
3
4
5
6
7
8
public class NHibernateRepository<EntityType>:IRepository<EntityType>
{
   /*...*/
   public void Save ( EntityType entity )
   {
       session.SaveOrUpdate(entity);
   }
}

然后,我们可以建立一个审核存储库:

1
2
3
4
5
6
7
8
9
10
public class AuditingRepository<EntityType>:IRepository<EntityType>
{
   /*...*/
   public void Save ( EntityType entity )
   {
       entity.LastUser = security.CurrentUser;
       entity.LastUpdate = DateTime.UtcNow;
       innerRepository.Save(entity)
   }
}

然后,使用IoC框架(StructureMap,Castle Windsor,NInject),您可以在不知道其余所有代码都在进行审计的情况下,全部构建它。

当然,如何审核级联集合的元素完全是另一个问题...


推荐阅读