Question

J'utilise NHibernate sur un projet et je dois effectuer un audit des données.j'ai trouvé Cet article sur codeproject qui traite de l'interface IInterceptor.

Quelle est votre méthode préférée pour auditer les données ?Utilisez-vous des déclencheurs de base de données ?Utilisez-vous quelque chose de similaire à ce qui est décrit dans l'article ?

Était-ce utile?

La solution

Pour NHibernate 2.0, vous devriez également regarder Écouteurs d'événements.Il s'agit de l'évolution de l'interface IInterceptor et nous les utilisons avec succès pour l'audit.

Autres conseils

[MODIFIER]

Après la sortie de NH2.0, veuillez consulter les écouteurs d'événements comme suggéré ci-dessous.Ma réponse est obsolète.


Le IInterceptor est le moyen recommandé pour modifier toutes les données en veille prolongée de manière non invasive.Il est également utile pour le décryptage/cryptage des données sans que le code de votre application ait besoin de le savoir.

Les déclencheurs sur la base de données déplacent la responsabilité de la journalisation (un problème d'application) vers la couche SGBD qui relie efficacement votre solution de journalisation à votre plate-forme de base de données.En encapsulant les mécanismes d'audit dans la couche de persistance, vous conservez l'indépendance de la plate-forme et la transportabilité du code.

J'utilise des intercepteurs dans le code de production pour assurer l'audit dans quelques grands systèmes.

Je préfère l'approche CodeProject que vous avez mentionnée.

Un problème avec les déclencheurs de base de données est qu'ils ne vous laissent pas d'autre choix que d'utiliser la sécurité intégrée couplée à ActiveDirectory pour accéder à votre serveur SQL.La raison en est que votre connexion doit hériter de l'identité de l'utilisateur qui a déclenché la connexion ;si votre application utilise un compte nommé « sa » ou d'autres comptes d'utilisateurs, le champ « utilisateur » reflétera uniquement « sa ».

Cela peut être contourné en créant un compte SQL Server nommé pour chaque utilisateur de l'application, mais cela ne sera pas pratique pour les applications Web publiques non intranet, par exemple.

J'aime l'approche Interceptor mentionnée et je l'utilise sur le projet sur lequel je travaille actuellement.

Cependant, un inconvénient évident qui mérite d’être souligné est que cette approche auditera uniquement les modifications de données apportées via votre application.Toutes les modifications directes des données telles que les scripts SQL ad hoc que vous devrez peut-être exécuter de temps en temps (cela arrive toujours !) ne seront pas auditées, à moins que vous n'oubliez d'effectuer les insertions de la table d'audit en même temps.

Je comprends que c'est une vieille question.Mais je voudrais répondre à cette question à la lumière du nouveau système d'événements de NH 2.0.Les écouteurs d'événements sont meilleurs pour les fonctions de type audit que les intercepteurs.Ayende a écrit un excellent exemple sur son blog le mois dernier.Voici l'URL de son article de blog -

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

Comme approche totalement différente, vous pouvez utiliser le modèle décorateur avec vos référentiels.

Dis que j'ai

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

Ensuite, nous aurions notre NHibernateRepository :

public class NHibernateRepository<EntityType>:IRepository<EntityType>
{
   /*...*/
   public void Save ( EntityType entity )
   {
       session.SaveOrUpdate(entity);
   }
}

Nous pourrions alors avoir un référentiel d'audit :

public class AuditingRepository<EntityType>:IRepository<EntityType>
{
   /*...*/
   public void Save ( EntityType entity )
   {
       entity.LastUser = security.CurrentUser;
       entity.LastUpdate = DateTime.UtcNow;
       innerRepository.Save(entity)
   }
}

Ensuite, en utilisant un framework IoC (StructureMap, Castle Windsor, NInject), vous pouvez tout construire sans que le reste de votre code sache que vous avez un audit en cours.

Bien sûr, la manière dont vous auditez les éléments des collections en cascade est une tout autre question…

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top