2011-03-11 3 views
4

Mon collègue au travail m'a posé une question à laquelle je ne peux pas répondre (en raison de l'inexpérience) qui est liée au suivi des changements de champs pertinents sur une table. Alors imaginez que nous avons 3 tables avec 20 champs chacune. Considérons pour cet exemple que chacune de ces tables a 2 champs, un nommé LastUpdatedOn et un autre nommé LastUpdatedBy.Suivi des changements dans un tableau

Si nous voulions garder une trace des changements dans ces 3 tables mais seulement pour quelques champs spécifiques sans créer un tableau Historique pour chacun d'eux contenant leur dernière version avant leur mise à jour, comment pourrions-nous garder trace des changements sur ces domaines pertinents et toujours le garder générique?

+2

Si vous n'allez pas créer de table Historique, où allez-vous enregistrer votre historique? –

+0

Cela semble déroutant, du moins pour moi. Mon collègue a dit que nous ne pouvons pas utiliser une table d'historique pour suivre les changements. La chose ici est, vous n'avez pas besoin de savoir quelles étaient les anciennes valeurs, tout ce que vous devez savoir est qu'un champ important a été changé. C'est le genre de suivi nécessaire. – Hallaghan

Répondre

4

Il n'est pas nécessaire de créer une table Historique/Audit pour chacun d'entre eux. Vous pouvez avoir une table simple, qui stocke la table et le nom du champ pour les champs que vous voulez suivre:

audit(audit_id, table_name, field_name, action_flg, updated_by, updated_on, val_before, val_after, pk_value1, pk_value2, pk_value3, pk_value4, pk_value5).

Vous devez stocker la clé primaire (zones pk_value1 à pk_value5) de la table afin d'identifier de manière unique la ligne qui a été modifiée. action_flg est utilisé si vous souhaitez suivre les mises à jour, les insertions ou les lignes qui ont été supprimées. Oracle utilise cette structure de table dans certains de ses produits.

Par exemple, supposons que vous avez une table person(person_id, name, email), et vous devez suivre les modifications apportées au champ email:

  1. Une personne (id=1) est créé: insert into audit(1, 'person', 'email', 'A' /* add */, 'USER', '11-03-2011', null, '[email protected]', 1, null, null, null, null);

  2. E courrier de la personne 1 est mis à jour: insert into audit(2, 'person', 'email', 'C' /* change */, 'USER', '12-03-2011', '[email protected]', '[email protected]', 1, null, null, null, null);

  3. Maintenant, supposons que l'e-mail de perso n 70 est mis à jour: insert into audit(3, 'person', 'email', 'C' , 'USER', '12-03-2011', '[email protected]', '[email protected]', 70, null, null, null, null);

+0

Merci, ça me sert bien. – Hallaghan

+2

Ceci est une option valide, mais comme tout a ses négatifs ainsi que des points positifs. Pour un, vous pouvez créer un joli point chaud si vous avez des milliers de tables d'écriture d'audits à une table par exemple. – Kuberchaun

2

Si vous ne savez pas besoin de ce qui a changé, seulement un certain domaine important a changé, il suffit d'ajouter une autre colonne d'horodatage, LastImportantUpdateOn ou quelque chose comme ça. Ajoutez ensuite un déclencheur pour récupérer les modifications dans les champs considérés comme "importants" et écrire un nouvel horodatage.

Si vous avez besoin de savoir quel champ a changé, ajoutez un nouvel horodatage pour chaque champ au lieu d'un en général.

Questions connexes