2009-09-16 5 views
1

J'ai une application CRUD existante à laquelle j'ai été chargée de mettre en œuvre la "gravure de tombeau". J'ai besoin d'un moyen pour permettre à un utilisateur de ramener une page donnée de données à l'état précédent.Implémenter l'annulation de données dans l'application CRUD existante

Dites que j'ai le prénom, le nom et le numéro de sécurité sociale sur une page de cette application. L'utilisateur A met à jour le champ Nom. Plus tard, l'utilisateur B remarque que le nouveau nom de famille est différent et veut voir qui l'a modifié et le renvoyer si nécessaire.

Je ne suis pas familier avec cela, donc si je suis manquant ou mal utilisé certains termes, pardonnez-moi.

Cette application a un backend MS SQL et la DAL est principalement SPROCS. À l'heure actuelle, il n'y a pas d'archivage ou de lapidation.

Je pensais juste faire une table pour chaque table existante appelée tblPerson -> tblPersonTombstone et ensuite la partie roll back lirait à partir de cette table. Malheureusement, les concepteurs de base de données d'origine l'ont conçu de telle sorte qu'une seule page de l'application pourrait contenir des informations provenant de 2 ou 3 tables différentes. Ainsi, j'imagine, j'ai besoin d'une approche plus basée sur les transactions.

Toute direction ou pointeur sera grandement appréciée. Suis-je sur la bonne voie avec ma pensée? Peut-être que je suis trop compliquer? Comment les autres l'ont-ils fait?

Je vois ce poste How to implement ‘undo’ operation in .net windows application? et aussi celui-ci New CodePlex project: a simple Undo/Redo framework mais je suis concerté que ni l'un ni l'autre ne correspondent à ma situation actuelle. Je ne cherche pas à laisser les utilisateurs cliquent sur ctl + z. Je dois les laisser ramener une page entière à un état antérieur. Si je me méprends sur l'utilisation de ces deux exemples, veuillez le dire.

Merci pour le temps.

Répondre

2

Ce dont vous parlez relève du domaine de l'audit. Malheureusement, c'est l'une des implémentations les plus impliquées.

Voici une meilleure pratique:

Créer de nouvelles « tables de révision » qui reflètent les tables en cours d'audit, mais incluent également des métadonnées supplémentaires (révision #, l'horodatage, l'utilisateur qui a fait le changement, type d'opération CRUD).

L'idée est de pouvoir facilement obtenir un instantané complet de l'enregistrement à tout moment, puis l'utiliser pour effectuer un retour en arrière parfait. Vous avez une confiance totale que les données sont correctes et que cela fonctionne.

La plupart des personnes utilisent des déclencheurs pour remplir ces enregistrements de révision.

Il existe également d'autres solutions. Évidemment, cela va prendre beaucoup de temps et beaucoup d'espace disque (mais bon, vous pouvez purger en toute sécurité les anciens enregistrements sans casser le système). L'avantage est que vous vous retrouvez avec une tonne de flexibilité.

C'est ainsi que la plupart des gens le font.

Voici une autre façon:

J'ai également mis en place un modèle d'audit plus simple qui ne cesse trace du nom de la table qui a changé, le champ qui a changé, l'ancienne valeur et la nouvelle valeur, ainsi que les métadonnées habituelles.Avec cela, j'ai écrit un plugin pour mon outil ORM qui gère à peu près la sauvegarde des données d'audit automatiquement. Sinon, cela aurait été très fastidieux.

Vous pourriez être tenté d'emprunter cette route. Et c'est vrai, vous pouvez probablement obtenir des retours en arrière. Mais ce serait plus difficile. Par exemple, si vous souhaitez restaurer à une date et une heure données, vous devez analyser tous ces enregistrements de modifications au niveau du champ afin de recréer l'instantané complet. Et malheur à vous si jamais vous changez le nom d'un champ! Donc, cette méthode d'audit est bien pour générer et afficher une piste d'audit, mais si vous voulez faire des rollbacks, il y a beaucoup plus de parties mobiles, et beaucoup plus de choses qui peuvent mal tourner. Tenez compte de mes mots: rester loin de cela si vous avez besoin de retour en arrière, ça va être plus de travail que de simplement créer ces tables de révision!

Liens

Voici un lien sur stackoverflow où ils parlent de la mise en œuvre d'audit dans SQL Server, certaines personnes mentionnent Change Data Capture qui est nouveau dans SQL Server 2008 Enterprise ... Il ne fait pas automatiquement rollbacks , mais il fait des données d'audit de magasin:

Suggestions for implementing audit tables in SQL Server?

+1

Vérification? Merci! Parfois, connaître le mot-clé correct est la moitié de la bataille. +1 –

+0

De rien! –

+0

On dirait qu'ils veulent que les rollbacks soient un processus manuel, donc une piste d'audit est tout ce dont j'ai besoin. On dirait que je vais explorer # 2. Y a-t-il un moyen de développer votre plugin ORM? J'utilise Linq To SQL comme ORM et j'apprécierais la direction. –

1

2 pensées:

  1. Créez une table d'archivage qui n'est pas nécessairement un doublon de vos tables persistantes mais qui préserve les données de la page avec la possibilité de restauration. Ainsi, si la page contient des champs ayant un impact sur plusieurs tables, votre table d'archivage contiendra des colonnes pour chaque champ modifiable de la page. Si les données de la page sont encapsulées dans un seul objet DTO ou entité, sérialisez l'objet avant de le stocker et stockez-le dans une table anarchique. Ensuite, si l'utilisateur souhaite revenir en arrière, vous pouvez le désérialiser puis enregistrer l'objet désérialisé.

+0

Je vais regarder dans # 1. Malheureusement, l'application originale n'a pas entièrement suivi la POO, donc il n'y a pas d'objets pour représenter les données. # 1 semble prometteur si bien que +1! Merci! –

Questions connexes