2009-09-17 8 views
6

Notre solution d'entreprise actuelle est une application ASP.NET MVC pilotée par Entity Framework. Il y a quelques liens sur la façon de se brancher sur les événements de changement pour l'audit. Je ne m'intéresse pas vraiment à ça.Enterprise Data Audit

Je m'intéresse à l'architecture d'audit d'entreprise. Ceux d'entre vous qui ont des blessures de combat au niveau de l'entreprise, quelles ont été vos solutions d'audit? Est-ce que vous sérialiser des objets dans des bases de données dans un cadre. Configurez-vous des déclencheurs de base de données pour auditer les tables? Utilisez-vous une base de données distincte pour que la croissance de votre audit n'affecte pas la base de données de votre application? Je suis intéressé par les solutions éprouvées ici. Je sais qu'il y a des options dans notre choix de technologie (EF), mais je m'intéresse d'abord à la fondation.

Des liens seraient très appréciés.

+0

Laissez-moi également faire une autre note importante. Nous sommes passionnés de pouvoir revenir en arrière et voir les anciennes données dans l'application. C'est là que nous pensons que la persistance des objets sérialisés est utile (pas seulement l'enregistrement des deltas). – RailRhoad

+2

La distinction entre une base de données et plusieurs bases de données est quelque peu artificielle. Les bases de données peuvent avoir plusieurs groupes de fichiers et les tables peuvent avoir plusieurs partitions. Vous pouvez traiter efficacement une base de données unique comme s'il s'agissait de plusieurs bases de données et une seule table comme s'il s'agissait de plusieurs tables. –

Répondre

1

Je l'ai vu plusieurs solutions, mais mon préféré était la simplicité même:

  • Créer des tables d'audit reflète chaque table source, en ajoutant quelques colonnes supplémentaires pour suivre la date et le type de modification (insérer, mettre à jour ou supprimer si vous le prenez en charge) et l'utilisateur effectuant la modification. Supprimez toutes les contraintes et tous les index (sauf si vous prévoyez effectuer beaucoup de recherches). À l'intérieur de la logique de mise à jour de la table (nous avons utilisé des procédures, mais il n'y a aucune raison que cela ne soit pas possible avec une couche OR/M ou une autre couche de persistance), écrivez dans la table source et table d'audit.

Cela a de nombreux avantages, mais le plus grand (à mon avis) est de ne pas avoir à se soucier ou écrire tout le code pour gérer l'intégrité transactionnelle des opérations d'écriture par paires dans le client.

+0

Aucun processus stocké ici avec la décision EF, mais nous pouvons accrocher dans les changements, ce qui signifie que nous pourrions faire cela sur la persistance. Donc, fondamentalement, c'est un miroir des tables de l'application dans un db séparé? – RailRhoad

+0

C'est vrai, sauf dans le même DB, de sorte que vous auriez des tables comme "Employee" et "EmployeeHistory" côte à côte. (Bien que le commentaire de Craig Stuntz se rapporte ici.) Rétrospectivement, il n'y a aucune raison pour moi de dire qu'il suppose des procédures stockées, donc j'ai modifié ce texte. –

+0

Cela signifie-t-il que la seule base de données doit tout écrire deux fois? Avez-vous remarqué un impact sur le débit de faire cela? – glenatron

2

Je n'ai aucun lien, mais dans le système que j'ai la joie de maintenir ici au travail de jour. Nous avons une seule table d'audit qui stocke les informations suivantes.

TableName, PrimaryKeyValue, modifiedColumn, OldValue, NewValue, ChangeUser, Changer la date

Maintenant, cela fonctionne très bien pour la vitesse d'audit, dans notre code, nous avons une interface commune pour l'enregistrement d'audit automatique mise en œuvre, mais de d'un point de vue «critique», ce n'est pas le moyen le plus «rapide» de récupérer l'information. (Accordé nous avons pas vraiment fait quoi que ce soit besoin de regarder le journal d'audit ...)

+0

Donc, fondamentalement, une table en croissance, est-ce dans la même DB? – RailRhoad

+0

Oui, c'est vrai, nous n'avons pas non plus d'index sur la table pour le moment non plus. Il est dans le même DB pour certains, mais il existe une autre version qui ajoute une colonne "Database" et est stockée à l'extérieur. –

+0

Comment gérez-vous les changements de relations? – camainc

2

Nous avons récemment dû résoudre ce même problème dans notre entreprise. Nous devions être en mesure de revenir à des versions antérieures aussi.

Nous avons fini par auditer les entités commerciales plutôt que les tables en SQL. Nous sérialisons fondamentalement les enregistrements dans la base de données et gardons la trace des changements qui sont faits d'une version à l'autre. Cette approche nous permet de récupérer les versions précédentes dans les entités métier, puis de revenir en appelant les mêmes opérations de sauvegarde. Cette fonctionnalité pour revenir en arrière sera déplacée sur la responsabilité des applications car elle doit être résolue ici sinon notre service pourrait avoir besoin de connaître trop de détails sur les applications participantes. Serivce Operations pour récupérer les enregistrements par versions, par dates, historique des vues et bien sûr pour vérifier les modifications. C'est une approche opt-in pour différents groupes d'applications et différentes entités (tout ne doit pas être audité dans la base de données, alors pourquoi le faire). Nous construisons ensuite un site Web léger qui parle au service et peut afficher toutes les versions.Nous avons construit un mécanisme pour montrer les additions/mises à jour/suppressions à comparer entre les versions (représentation vraiment cool de l'interface utilisateur), ce qui permet aux utilisateurs de voir qui a changé quoi et quand. Le service peut renvoyer un lien vers l'URL pour afficher les versions d'une entité. Cela permet à nos webaps + winform/wpf apps de lancer un navigateur afin que les utilisateurs puissent voir les changements.

Peut-être que je peux emballer cela et fournir si quelqu'un est intéressé ....

+0

Vous prenez donc les objets EF et sérialisez ceux qui sont stockés dans une table/base de données d'audit? Comment gérez-vous les relations parent-enfant? – glenatron