Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/07/2011, 10h46   #1
Nouveau Membre du Club
 
Homme Ahmed Med
Webmaster
Inscription : mai 2009
Messages : 142
Détails du profil
Informations personnelles :
Nom : Homme Ahmed Med
Localisation : Maroc

Informations professionnelles :
Activité : Webmaster
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mai 2009
Messages : 142
Points : 32
Points : 32
Par défaut Comment avoir l'historique de deux tables ?

Bonjour tout le monde,

Voila je doit faire un historique des enregistrements de deux tables lier, chaque fois que je fait un update ou delete ou insert je doit copier les valeurs modifier(supprimer ou inserer) dans des tables identique aux table principe(les meme champs),vous trouverez on piece joint une image avec le shema de mes tables.
j'ai ajouter un champ indice pour recuperer l'historique. Mon problem c'est que quand j'ajoute un enregistrement dans la table :CopieTableB (voir l'image) avec un ID_attA et ID_attB existant deja mais avec un nouveau indice il m'affiche un erreur de violation de contraint unique.
Je sollicite votre aide et j'attend des propositions sur mon shema des tables si je doit enleve une attribue ou faire des modif.
Merci d'avance et je suis disponible pour plus d'explication

PS:
je ne veut pas utiliser des trigger(tout les actions(insert,update,delete) je doit les faire en code vb.net).
Images attachées
Type de fichier : png histo.PNG (16,2 Ko, 8 affichages)
ahmedige est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 11h25   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Il faut inclure vos indices dans vos clefs primaires des tables de copie.

Ne pas utiliser de triggers est une erreur.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 12h25   #3
Membre expérimenté
 
Homme Mohamed Houri
Inscription : mars 2010
Messages : 286
Détails du profil
Informations personnelles :
Nom : Homme Mohamed Houri
Localisation : France

Informations forums :
Inscription : mars 2010
Messages : 286
Points : 563
Points : 563
Bonjour,

Vous avez une table A (parent table) et vous voudriez être capable à tout moment de lister toute modification faite sur cette table (update/delete).
Vous avez une table B (child table) et vous voudriez être capable à tout moment de lister toute modification faite sur cette table (update/delete).

Voici quelques remarques
(a) Comme l'integrité est assurée dans les tables d'origine, il me semble qu'il ne faut pas reproduire ces mêmes contraintes dans les tables copies
(b) vous ne devriez pas definir les mêmes unique keys dans les tables copies que celles qui existent dans les tables d'origine. Pensez un peu à vos "requirements" techniques. Vous voulez historiser tous les updates dans la table A (et B).
Deux updates d'un record unique dans la table A (ou B) peuvent avoir lieu à tout moment ce qui va générer deux inserts dans les tables copies; ces inserts vont être rejetés si vous implémentez les mêmes unique keys dans les tables copies

(c) vous pouvez ne pas historiser les inserts; en effet un record présent dans la table A et non présent dans la table copie A veut dire que ce record n'a jamais été mis à jour.
(d) au lieu d'ajouter un champ indice ajouter plutot une clé primaire basée sur une séquence et donnez lui un nom parlant. Au passage, cette clé primaire (ou le champs indice) sont des "meaningless keys" c'est à dire qu'elles ne servent pas grand chose toutes seules lors d'un select sur l'historique

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
 
mhouri.world > DROP TABLE table_a;
 
TABLE dropped.
 
mhouri.world > DROP TABLE table_a_his;
 
TABLE dropped.
 
mhouri.world > CREATE TABLE table_a AS SELECT * FROM emp;
 
TABLE created.
 
mhouri.world >CREATE TABLE table_a_his AS SELECT * FROM emp WHERE 1 = 2;
 
TABLE created.
 
 
mhouri.world > CREATE sequence his_seq;
 
Sequence created.
 
mhouri.world > ALTER TABLE table_a_his ADD his_id number PRIMARY KEY;
 
TABLE altered.
 
mhouri.world > CREATE OR REPLACE TRIGGER tab_a_trg
  2  BEFORE UPDATE OR DELETE
  3  ON table_a
  4  REFERENCING OLD AS OLD NEW AS NEW
  5  FOR EACH ROW
  6  
  7  BEGIN
  8  
  9   INSERT INTO table_a_his
 10                     ( empno
 11                      ,ename
 12                      ,job
 13                      ,mgr
 14                      ,hiredate
 15                      ,sal
 16                      ,comm
 17                      ,deptno
 18                      ,his_id
 19                       )
 20            VALUES   ( :old.empno
 21                      ,:old.ename
 22                      ,:old.job
 23                      ,:old.mgr
 24                      ,:old.hiredate
 25                      ,:old.sal
 26                      ,:old.comm
 27                      ,:old.deptno
 28                      ,his_seq.NEXTVAL);
 29  
 30  END tab_a_trg;
 31  /
 
TRIGGER created.
 
mhouri.world >
mhouri.world > UPDATE table_a
  2  SET sal = 930
  3  WHERE empno = 7369;
 
1 row updated.
 
mhouri.world > SELECT empno, sal, his_id
  2  FROM table_a_his;
 
     EMPNO        SAL     HIS_ID                                                
---------- ---------- ----------                                                
      7369        815          1                                                
 
mhouri.world > UPDATE table_a
  2  SET sal = 1000
  3  WHERE empno = 7369;
 
1 row updated.
 
 
mhouri.world >SELECT empno, sal, his_id
  2  FROM table_a_his;
 
     EMPNO        SAL     HIS_ID                                                
---------- ---------- ----------                                                
      7369        815          1                                                
      7369        930          2                                                
 
mhouri.world > DELETE FROM table_a
  2  WHERE empno = 7369;
 
1 row deleted.
 
mhouri.world > SELECT empno, sal, his_id
  2  FROM table_a_his;
 
     EMPNO        SAL     HIS_ID                                                
---------- ---------- ----------                                                
      7369        815          1                                                
      7369        930          2                                                
      7369       1000         21
Bien cordialement

Mohamed Houri
Mohamed.Houri est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/07/2011, 12h49   #4
Nouveau Membre du Club
 
Homme Ahmed Med
Webmaster
Inscription : mai 2009
Messages : 142
Détails du profil
Informations personnelles :
Nom : Homme Ahmed Med
Localisation : Maroc

Informations professionnelles :
Activité : Webmaster
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mai 2009
Messages : 142
Points : 32
Points : 32
C'est ce que je viens de faire , j'ai supprimer les clé primaire des tables copietableA et copierTableB(ID_attCA,ID_attCB) et j'ai met l'indice comme cle primaire dans ces deux table mais j'ai toujour la meme erreur.

Je sais que c'est plus facil de faire des trigger mais le probleme que j'ai c'est que j'ai pas le droit d'utiliser un insert(CopieTableB) chaque fois que je fait un update(TableB) ,c'est a dire (PS j'ai deux button A pour inserer ou modifier dans la table A et Button B pour la table B et je peut clicker plusieurs fois sur le button B avant de clicker sur le button A)

J'ouvre ma page vb.net on mode Ajout d'un nouveau enrregistrement dans la table A(indice=1): je peut creer autant d'enregistrement sur la table B et faire en meme temps un copier vers la table CopieTableB ,mais si je veux modifier un enregistrement dans la table B, je ne doit pas faire une insertion dans la table copieTableB car l'indice est toujour le meme dans la table A je doit juste faire un update dans les deux table (principe et la copier de B),apres ca, je valide et j'enregistre dans la table A ainsi que la CopieTableA.

J'ouvre ma page vb.net on mode modification d'un enregistrement de la table A (indice=2 j'increment l'indice):si je fais une modification d'un enregistrement deja existant de la table B je doit l'inserer dans la table copieTableB car l'indice =2(c'est a ce stade que il m'affiche l'erreur de violation de contraint unique) mais si je fait une modification apres la premier je doit juste le modifier dans la table copieTableB car indice deja existant.

Je ne sais pas si un trigger peut faire un test pour savoir a quel moment doit faire un insert ou update dans la table copieTableB (j'ai jamais fait des trigger donc faible),mais si c'est possible je suis interesser.J'espere que j'ai bien explique mon cas et que je ne me suis pas perdu dans mes mots
ahmedige est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h22.


 
 
 
 
Partenaires

Hébergement Web