Question

Je suis en train de créer une fonctionnalité qui maintient une piste de vérification de la façon dont les données dans un formulaire utilisateur donné a été changé au fil du temps, avec un audit daté au pied de cette page. Par exemple:

02/04/09 21:49 Nouveau nom de "Tom" à "Chris".

Je fais cela en stockant les données dans son format présent dans la session, puis lors de l'enregistrement vérifier s'il y a des différences dans les données stockées. S'il y a, je le stockage des données comme avant la dernière édition d'une table qu'on appelle l'histoire, et la mémorisation des nouvelles valeurs dans le tableau de l'utilisateur actuel.

Est-ce la meilleure approche pour prendre?

Était-ce utile?

La solution

Une suggestion; ce serait relativement facile à faire dans un déclencheur de base de données. Dans ce cas, vous auriez jamais à vous soucier de savoir si le code en cours d'exécution de la mise à jour se souvient d'ajouter un enregistrement historique.

Autres conseils

Je ne suis pas sûr qu'il ya une « meilleure approche », il y a tellement de variables à prendre en considération, y compris jusqu'à quel point sur le chemin de développement que vous êtes.

Après avoir traversé les deux à base de code et des solutions d'audit db-déclenchement, j'ai énuméré quelques commentaires ci-dessous; J'espère que vous pouvez voir où vous êtes maintenant (en termes de développement) pourraient influer sur ces questions:

  • Si vous devez mapper l'utilisateur qui a changé les données (que vous faites normalement) puis db déclencheurs devront obtenir cette information en quelque sorte. Pas impossible, mais plus de travail et plusieurs façons d'aborder cette (db requête exécutant utilisateur, colonne utilisateur commun dans chaque table, etc.)
  • Si vous utilisez des déclencheurs db et que vous comptez sur les lignes affectées nombre retourné des requêtes, votre vérification déclenche besoin d'avoir cette désactivé ou votre code existant modifié pour en tenir compte.
  • IMHO db déclencheurs offrent plus de sécurité, et offrent un chemin plus facile de vérifier l'automatisation, mais ils ne sont pas à toute épreuve, comme toute personne ayant accès approprié peut désactiver les déclencheurs, modifier les données, puis les réactiver. En d'autres termes, assurez-vous vos droits d'accès de sécurité db sont bien serrés.
  • Avoir une seule table pour l'histoire n'est pas une mauvaise façon de faire, même si vous aurez plus de travail à faire (et les données à stocker) si vous l'histoire d'audit pour plusieurs tables, en particulier en ce qui concerne la reconstruction de la piste d'audit. Vous devez également considérer les problèmes de verrouillage s'il y a beaucoup de tables en essayant d'écrire sur une table de vérification.
  • Avoir une table d'historique d'audit pour chaque table est une autre option. Vous avez juste besoin de chaque colonne dans la table de vérification pour être annulable, ainsi que le stockage date et l'heure de l'action (insertion / mise à jour / supprimer) et l'utilisateur associé à l'action.
  • Si vous allez avec l'option de table unique, sauf si vous avez beaucoup de temps à consacrer à ce sujet, ne soyez pas trop envie d'essayer de vérifier que les mises à jour ou suppressions, mais il peut être tentant d'éviter les inserts (puisque la plupart applications font plus souvent que les mises à jour ou suppressions), la reconstruction de l'histoire de l'audit prend un peu de travail.
  • Si vos serveurs ou données couvrent plusieurs fuseaux horaires, puis envisager d'utiliser un type datetime approprié pour être en mesure de stocker et de reconstruire la chronologie, à savoir la date de l'événement d'audit magasin UTC ainsi que notamment le décalage horaire.
  • Ces tables de vérification peuvent obtenir énorme, donc avoir une stratégie si elles commencent à affecter les performances. Les options incluent le partitionnement des tables sur des disques différents, archivage, etc. pense essentiellement à ce sujet maintenant et non quand il devient un problème:)

J'ai toujours été fan d'utiliser une table au lieu de le découper en une table « active » et une table « historique ». Je mets 4 colonnes sur ces tables, tous les horodateurs: création, suppression, début, fin. « Créé » et « supprimé » sont assez explicites. Les « start » et « end » horodatages lorsque le dossier était en fait le dossier « actif ». Le record actuellement actif aurait un temps « commencer » avant now() et un NULL « fin » du temps. En séparant les « start » fois « créé » et, vous pouvez planifier des changements avoir lieu à l'avenir.

Cette conception, par opposition à la conception de deux tables, vous permet d'écrire facilement des requêtes qui fonctionneront automatiquement sur les bonnes données. Supposons que votre table stocke le taux d'imposition au fil du temps ... vous ne voulez pas avoir toutes vos requêtes qui utilisent les taux d'imposition dans leurs calculs ont la complexité supplémentaire de décider de regarder des choses dans une table d'historique lors du traitement de vieilles factures, pour par exemple ... vous pouvez juste regarder le taux d'imposition en vigueur au moment où la facture a été créée dans une requête, peu importe que ce soit le taux d'imposition en cours ou non.

Cette idée est pas à l'origine à moi (même si je ne réinventent l'idée approximative de moi-même avant de lire à ce sujet) ... vous pouvez trouver une discussion détaillée dans cette livre en ligne .

La participation de la session me fait un peu méfiant (êtes-vous sûr que vous manipulez correctement lorsque deux utilisateurs travaillent sur les mêmes données en même temps?), Mais en général, oui, en gardant une table d'historique est le droit chose.

Je pense aussi à un déclencheur de base de données à l'insertion ou la mise à jour pour enregistrer les détails de changement (qui, quand, quoi, valeur avant, la valeur après) à une table de vérification distincte. De cette façon, vous savez que même si les données sont modifiées outide de votre application en utilisant la base de données directement, il sera toujours pris.

Vous pouvez également faire quelque chose pour détecter si les données sont modifiées outide de votre application, par exemple calculer un hachage ou crc de l'enregistrement et le stocker dans un champ de vérifier quelque part, puis lors de la lecture des données.

Je pense que votre proposition impliquerait d'écrire beaucoup de code / métadonnées pour permettre une comparaison des objets / dossiers afin que vous obteniez un audit niveau d'activité.

Vous pouvez également un déclencheur de base de données ne peut pas vous donner une vue de niveau suffisamment élevé de ce qui est arrivé. Cela peut être acceptable si vous utilisez la vérification si rarement que l'effort de recréer le sens des affaires est ok.

Cela semble aussi comme une bonne application pour AOP (aspects), où l'on pouvait utiliser la réflexion sur le modèle d'objet pour vider quelque chose de significatif sans nécessiter beaucoup de métadonnées.

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