Bonjour à tous,
Je suis en train de développer un système de synchronisation bidirectionnel entre 2 bases de données (situé sur le même serveur). Cela concerne une seule table.
Voici la procédure qui pose problème :
Voici le DATABASE LINK :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 CREATE OR REPLACE PROCEDURE synch_hydrant_ins(id IN NUMBER) IS user_name VARCHAR2(100); BEGIN SELECT SYS_CONTEXT('USERENV', 'SESSION_USER') INTO user_name FROM DUAL; IF user_name<>'SYNCH' THEN INSERT INTO HYDRANT (SELECT * FROM HYDRANT@WEBLK WHERE CARTO_REF = id); END IF; COMMIT; END; /
L'erreur à lieu à la création de la procédure, le message est le suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part CREATE DATABASE LINK WEBLK CONNECT TO SYNCH IDENTIFIED BY ** USING '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = *********)(PORT = 1521)))(CONNECT_DATA = (SERVICE_NAME = ********)))';
Ce que je ne comprend pas c'est que la requête suivante fonctionne correctement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 LINE/COL ERROR -------- ----------------------------------------------------------------- 8/3 PL/SQL: SQL Statement ignored 8/38 PL/SQL: ORA-00942: table or view does not exist
Code : Sélectionner tout - Visualiser dans une fenêtre à part INSERT INTO HYDRANT (SELECT * FROM HYDRANT@WEBLK WHERE CARTO_REF = [n'importe quoi]);
Compléments d'informations sur le contexte :
Je check le nom d'utilisateur pour éviter les boucles infinies (trigger BDD1 -> procédure BDD2 -> trigger BDD2 -> procédure BDD1 -> trigger BDD1...).
L'utilisateur utilise un compte SCOOT pour faire les modification ce qui qui déclenche le trigger. Le fait de créé la DATABASE LINK avec l'utilisateur SYNCH casse la boucle au niveau des procédures.
Voici le trigger de la BDD1 qui fait appelle à la procédure de la BDD2 (qui pose problème) :
Lors d'une insertion la nouvelle donnée est également ajouté à la BDD2
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 CREATE OR REPLACE TRIGGER T_INSERT_HYDRANT AFTER INSERT ON HYDRANT FOR EACH ROW BEGIN synch_hydrant_ins@APPLK(:new.CARTO_REF); END; /
Les UPDATE et DELETE sont également géré. Les procédures et triggers sont présent sur les 2 BDD (synchro bidirectionnel).
Merci de ne pas souligner le peu d'intérêt de la réplication de 2 BDD qui sont sur le même disque dur ce choix ne m'appartient pas
Merci d'avance!
Partager