IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Réplication entre colonnes


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 291
    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 ?

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    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

  3. #3
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 291
    Par défaut
    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)

  4. #4
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réplication entre deux serveurs SQL
    Par nicolovitch dans le forum Réplications
    Réponses: 6
    Dernier message: 19/07/2007, 14h28
  2. [Struts-Layout] espace entre colonne
    Par david06600 dans le forum Struts 1
    Réponses: 1
    Dernier message: 09/10/2006, 18h36
  3. [VB6] lien entre colonnes??!!
    Par jeanli dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 06/05/2006, 19h15
  4. [VBA-E] PROBLEME de recherche entre colonnes
    Par july92 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 08/02/2006, 09h35
  5. Espace entre colonnes d'un tableau
    Par rhum_un dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 09/11/2005, 13h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo