2010-12-10 75 views
1

Nous avons plusieurs applications qui mettent à jour une certaine table ms sql 2005 (application web asp.net, service C# windows, analyseur d'e-mails utilise sql + VB)) et souhaite stocker les informations d'audit sur la table. Par exemple. ModifiedBy, ModifiedDate où ModifiedBy = Nom de l'application mettant à jour l'enregistrement.Meilleure façon de générer des informations d'audit et d'archivage dans une base de données sql partagée par plusieurs applications

Nous aimerions également archiver les informations sur la table; Lorsque nous mettons à jour un enregistrement particulier, stockez l'enregistrement en cours dans une table myTable_Archive et marquez-le avec une date et mettez à jour l'enregistrement actuel dans myTable en conséquence.

Quelle est l'approche la plus facile à maintenir et à tester pour résoudre ce problème tout en limitant l'impact aux applications existantes? Ou quelqu'un peut-il suggérer un meilleur itinéraire? Appel d'une procédure de stockage, bibliothèque partagée C# (en utilisant nhibernate/ado.net, etc.), Ou une fonction intégrée de ms sql 2005 s'il y en a une par exemple.

Répondre

2

La manière la plus facile à faire (et assez standard) de faire ce genre d'audit est d'utiliser triggers sur les tables en question.

Comme ils existent entièrement dans la base de données, vos applications ne changeront pas du tout.

Bien sûr, les déclencheurs auront un impact sur les performances (puisque l'on change maintenant plus d'une table dans un appel).

+0

Merci, c'est une petite suggestion de changement qui serait très probablement résoudre mon scénario. Y a-t-il un moyen dans le déclencheur de déterminer l'application ou le processus appelant afin que je puisse l'utiliser dans le champ ModifiedBy (nom de l'application)? –

+0

@Luke Hutton - Tant que votre chaîne de connexion contient cette information, vous devriez pouvoir la récupérer dans les tables système. Voir la réponse de @Conrad Frix – Oded

+0

merci, va descendre cette route, va créer des tests autour des déclencheurs. –

2

J'ai trouvé que le plus simple est via des déclencheurs. Pour obtenir l'exigence ModifiedBy = nom de l'application, vous devez effectuer deux opérations:

1) Mettez à jour les chaînes de connexion pour définir le nom de l'application. Par exemple, vous pouvez: ..Database=Foo;Application Name = Parser;

2) Ensuite, dans votre déclencheur, vous pouvez obtenir le nom via

select program_name from sys.dm_exec_sessions where session_id = @@SPID

+0

+1 pour la réponse ModifiedBy –