Question

Le sujet de la façon de vérifier les tables a récemment vu le jour dans nos discussions ... donc j'aime votre avis sur ce qui est la meilleure façon d'aborder ce sujet. Nous avons un mélange des deux approches (ce qui est bon) dans notre base de données, comme chaque précédent DBA a fait ce qu'il / elle croyait être la bonne façon. Nous avons donc besoin de les changer pour suivre un modèle unique.

CREATE TABLE dbo.Sample(
Name VARCHAR(20),
...
...
Created_By VARCHAR(20),
Created_On DATETIME,
Modified_By VARCHAR(20),
Modified_On DATETIME
)

CREATE TABLE dbo.Audit_Sample(
Name VARCHAR(20),
...
...
Created_By VARCHAR(20),
Created_On DATETIME,
Modified_By VARCHAR(20),
Modified_On DATETIME
Audit_Type VARCHAR(1)  NOT NULL
Audited_Created_On DATETIME
Audit_Created_By VARCHAR(50)
)

Approche 1: Magasin, dans les tableaux de vérification, seuls les enregistrements qui sont remplacés / supprimés de la table principale (en utilisant le tableau du système SUPPRIME). Donc, pour chaque mise à jour et de suppression dans la table principale, l'enregistrement qui est remplacé est inséré dans la table de vérification de colonne Audit_Type «à garrot « U »(pour UPDATE) ou « D »(pour supprimer)

INSERTs ne sont pas auditées. Pour la version actuelle de tout document que vous avez toujours interroger la table principale. Et pour la table de vérification historique vous interrogez.

Plus: Semble intutive, pour stocker les versions précédentes d'enregistrements Inconvénients: Si vous avez besoin de connaître l'histoire d'un enregistrement particulier, vous devez joindre à la table d'audit avec table principale

.

appraoch 2:. Store, dans le tableau de vérification, chaque enregistrement qui va dans la table principale (en utilisant le tableau du système appliqué)

Chaque enregistrement qui est INSERTION / Modifiée / SUPPRIME à la table principale est également stockée dans la table de vérification. Ainsi, lorsque vous insérez un nouvel enregistrement, il est également inséré dans la table d'audit. Lorsque mis à jour, la nouvelle table la version (de INSÉRÉ) est stockée dans la table de vérification. Lorsque table supprimée, ancienne version (de SUPPRIME) est stockée dans la table d'audit.

Avantages: Si vous avez besoin de connaître l'histoire d'un enregistrement particulier, vous avez tout en un seul endroit

.

Bien que je ne l'ai pas énumérer tous ici, chaque approche a ses avantages et ses inconvénients?

Était-ce utile?

La solution

Je vais avec:

  

appraoch 2: Store, dans le tableau de vérification, chaque enregistrement qui va dans le tableau principal   (En utilisant la table système AJOUTE).

est une ligne supplémentaire par article va vraiment tuer la DB? De cette façon, vous avez ensemble l'histoire complète.

Si vous séparerai les lignes (une plage tous les jours de plus que X) vous pouvez toujours dire si quelque chose a changé ou non:

  • si une ligne d'audit existe (non purgés) vous pouvez voir si la ligne en question a été modifiée.
  • si aucune ligne de vérification existent pour l'élément (tous ont été purgés) rien changé (car tout changement écrit à la table de vérification, y compris les éléments complètement nouveaux)

si vous allez avec appraoch 1:. Et purge une plage, il sera difficile (besoin de se rappeler la date de purge) pour dire aux nouveaux inserts contre ceux où toutes les lignes ont été purgés

Autres conseils

Une troisième approche que nous utilisons beaucoup est de ne vérifier les colonnes intéressantes, et sauver à la fois la valeur « nouvelle » et « ancienne » sur chaque ligne.

Donc, si vous avez votre colonne « nom », la table de vérification aurait « name_old » et « name_new ».

Dans déclencheur INSERT, « name_old » est réglé sur blanc / null en fonction de vos préférences et « name_new » est réglé à partir ENFONCÉES. Dans déclencheur UPDATE, « name_old » est réglé à partir SUPPRIME et « name_new » de INSÉRÉ Dans déclenchement SUPPRIMER, « name_old » est réglé à partir SUPPRIME et « nouveau_nom » à blanc / null.

(ou vous utilisez une jointure complète et un déclencheur pour tous les cas)

Pour les champs VARCHAR, cela pourrait ne pas ressembler à une bonne idée, mais pour ENTIER, DATETIME, etc, il offre l'avantage qu'il est très facile de voir la différence de la mise à jour.

i.e.. si vous avez une quantité de champ dans votre table réelle et mettre à jour de 5 à 7, vous auriez dans le tableau d'audit:

quantity_old  quantity_new
           5             7

vous pouvez facilement calculer que la quantité a augmenté de 2 sur le moment précis.

Si vous avez des lignes distinctes dans la table d'audit, vous devrez joindre une ligne avec « l'autre » pour calculer la différence - qui peut être difficile dans certains cas ...

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