Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour 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 28/03/2008, 15h24   #1
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
Par défaut Réplication entre colonnes

Pour des raisons assez basses, j'ai besoin d'avoir une information qui soit systématiquement dupliquée entre deux tables. Par exemple, disons que j'ai TOTO(ID, Val) et TATA(ID, Val), et que pour une même ID, je dois avoir la même Val dupliquée entre les deux tables (je sais, ça n'est pas très clean).

J'ai donc créé des trigger AFTER INSERT et AFTER UPDATE des deux côtés. Problème : les triggers se déclenchent mutuellement, et j'obtiens une erreur
Citation:
Envoyé par Oracle
ORA-04091: table MOI.TOTO is mutating, trigger/function may not see it
Y a-t-il un moyen d'éviter ce déclenchement en cascade ?
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2008, 15h42   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
tu peux créer un package avec juste une variable que tu mets à 1 par exemple quand le trigger se déchenche. Ensuite, t'as plus qu'à tester cette variable pour éviter d'exécuter le code 2 fois
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2008, 15h45   #3
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
C'est effectivement le genre de truc que je cherche... mais si tu avais un bout de code, ça m'aiderait ! (jamais fait de packages)
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2008, 16h06   #4
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Exemple :
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
CREATE TABLE tab1 (id_tab1 INTEGER, id_tab2 INTEGER);
CREATE TABLE tab2 (id_tab2 INTEGER, id_tab1 INTEGER);
INSERT INTO tab1 VALUES (1,2);
INSERT INTO tab2 VALUES (2,1);
COMMIT;
 
CREATE OR REPLACE PACKAGE global_variable 
AS 
is_triggered NUMBER := 0;
END;
/
 
CREATE OR REPLACE TRIGGER tab1_BIU 
AFTER UPDATE OF id_tab1
ON tab1
FOR EACH ROW
BEGIN
IF global_variable.is_triggered = 0 THEN
  global_variable.is_triggered := 1;
  UPDATE tab2 SET id_tab1 = :NEW.id_tab1 WHERE id_tab2 = :OLD.id_tab2;
  dbms_output.put_line('OK 1');
END IF;
global_variable.is_triggered := 0;
END;
/
 
CREATE OR REPLACE TRIGGER tab2_BIU 
AFTER UPDATE OF id_tab2
ON tab2
FOR EACH ROW
BEGIN
IF global_variable.is_triggered = 0 THEN
  global_variable.is_triggered := 1;
  UPDATE tab1 SET id_tab2 = :NEW.id_tab2 WHERE id_tab1 = :OLD.id_tab1;
  dbms_output.put_line('OK 2');
END IF;
global_variable.is_triggered := 0;
END;
/
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
SQL> SELECT * FROM tab1;
 
   ID_TAB1    ID_TAB2
---------- ----------
         1          2
 
SQL> SELECT * FROM tab2;
 
   ID_TAB2    ID_TAB1
---------- ----------
         2          1
 
SQL> UPDATE tab1  SET ID_TAB1=3;
OK 1
 
1 row updated.
 
SQL> 
SQL> SELECT * FROM tab1;
 
   ID_TAB1    ID_TAB2
---------- ----------
         3          2
 
SQL> SELECT * FROM tab2;
 
   ID_TAB2    ID_TAB1
---------- ----------
         2          3
 
SQL> UPDATE tab2 SET ID_TAB2=4;
OK 2
 
1 row updated.
 
SQL> SELECT * FROM tab1;
 
   ID_TAB1    ID_TAB2
---------- ----------
         3          4
 
SQL> SELECT * FROM tab2;
 
   ID_TAB2    ID_TAB1
---------- ----------
         4          3
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2008, 16h13   #5
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
Pour mon info, la variable globale est globale globale, ou bien elle peut avoir des valeurs différentes d'une session à l'autre ?
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2008, 16h17   #6
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
elle est pour la session courante uniquement évidemment... comme toutes les variables de n'importe quel package
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2008, 17h46   #7
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
ça marche nickel !
merci beaucoup.
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h05.


 
 
 
 
Partenaires

Hébergement Web