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 :

Database Link et Procedure [10gR2]


Sujet :

SQL Oracle

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Database Link et Procedure
    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 :

    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;
    /
    Voici le DATABASE LINK :
    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 = ********)))';
    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
    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
    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
    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) :
    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;
    /
    Lors d'une insertion la nouvelle donnée est également ajouté à la BDD2
    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!

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Assurez-vous que l’utilisateur propriétaire de la procédure a reçu les droits d’accès aux divers objets directement et non pas via des rôles.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Merci pour votre réponse. Je comprend ce que vous voulez dire mais je ne vois pas trop quoi faire.

    Donc sur les 2 DB j'ai un utilisateur GCES et un utilisateur SYNCH.
    Sur la DB1 je créé la procédure, avec l'utilisateur GCES, qui va chercher les données dans la DB2.
    Cette procédure utilise l'utilisateur SYNCH pour se connecter à la BD2 (via le DATABASE LINK)

    Ce que je compris dans votre message c'est que le propriétaire de la procédure (GCES de la DB1) doit avoir le droit de lecture sur la table HYDRANT de la DB2

    Je ne vois pas trop comment attribuer des droits sur un objet de la DB2 à un utilisateur de la DB1. J'ai essayé plusieurs solutions tirées de ce thread :
    Sur la DB1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    GRANT select ON hydrant@APPLK TO gces;
    ERROR at line 1:
    ORA-02021: DDL operations are not allowed on a remote database
    Sur la DB2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    GRANT select ON hydrant TO gces@WEBLK;
    ERROR at line 1:
    ORA-00933: SQL command not properly ended
    Je vais chercher un peu dans cette direction mais sir qqun à une idée je suis preneur

    P.S.:
    DB1 => WEBLK
    DB2 => APPLK

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    D'après cette discussion je dois faire sur la DB2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GRANT ALL ON gces.hydrant TO SYNCH
    Mais cela ne fonctionne pas non plus.

  5. #5
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Vous dite que à la création de la procédure vous avez un message de type table ou vue inexistante. Dans votre procédure sur la ligne qui signale l'erreur vous faite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT INTO HYDRANT (SELECT * FROM HYDRANT@WEBLK WHERE CARTO_REF = id);
    Votre procédure est crée dans le schéma user1 de la base DB1.
    Ce que vous devez vérifier:
    • que vous avez accès directement à la table Hydrant soit parce qu'elle appartient à l'utilisateur user1 soit parce que le synonyme Hydrant pointe vers une table appartenant à un autre utilisateur user2 de la même base DB1 qui a donné des droits d'accès au utilisateur user1
    • que vous avez accès via le database link à la table Hydrant de la base DB2 soit parce qu'elle appartiens à l'utilisateur user3 (celui utilisé par le database link) soit parce que la table appartient à un autre utilisateur user4 de la base DB2 qui a donnée l'accès à l'utilisateur user3.

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Merci! Je n'ai pas compris l'ensemble de votre message mais vous m'avez mis sur la bonne piste! Notamment quand vous avez dit :

    Citation Envoyé par mnitu Voir le message
    que vous avez accès directement à la table Hydrant
    J'ai tout simplement essayé en préfixant la table :
    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 gces.HYDRANT@WEBLK WHERE CARTO_REF = id);
    	END IF;
    	COMMIT;
    END;
    /
    Et ça fonctionne! Merci
    J'ai appris que le fait de préfixer les objets réduit le risque d'erreur.

    Après je ne vois pas trop la logique dans tout ça. L'objet "hydrant" n'est pas une vue mais bien une table. Tout les utilisateurs y on accès "directement", que ça soit GCES ou SYNCH
    Pour que SYNCH y ai accès j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE OR REPLACE TRIGGER synch_set_schema
    AFTER logon ON DATABASE WHEN (USER='SYNCH')
    BEGIN
    	EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = GCES';
    END;
    /
    Comme ça quand je me log je peux faire directement un
    Sans préfixer

    Pour le côté pédagogique de la chose, si qqun pouvez m'expliquer pourquoi je dois préfixer.
    Concrètement le problème est résolu mais je mettrai [RESOLU] uniquement en fin de journée si il n'y a toujours pas d'explication.

    P.S.: Je n'ai pas compris tout votre message car je ne vois pas trop qui est USER1, 2 et 3

  7. #7
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Bref c'est simple: via le database link vous vous connectez comme utilisateur SYNCH (user3) mais la table Hydrant appartient à l'utilisateur GCES(user4).

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Oui, c'est simple quand on sait que la connexion via un DATABASE LINK ne déclenche pas le TRIGGER "AFTER LOGON". Maintenant je sais

    Merci pour tout mnitu, ce fut un plaisir de poster ma première question sur ce forum

    Bonne continuation

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

Discussions similaires

  1. Database link et procédure
    Par Sir Coco dans le forum PL/SQL
    Réponses: 10
    Dernier message: 02/04/2008, 16h13
  2. Database Link et Procedures
    Par vinczente dans le forum SQL
    Réponses: 4
    Dernier message: 20/09/2006, 09h02
  3. partage de lien DATABASE LINK
    Par de LANFRANCHI dans le forum Administration
    Réponses: 5
    Dernier message: 21/09/2004, 08h40
  4. Erreur ORA-12514 avec database link
    Par gafreu dans le forum Administration
    Réponses: 20
    Dernier message: 09/09/2004, 11h53
  5. DATABASE LINK + type Long et long raw ...
    Par bchristo dans le forum Administration
    Réponses: 21
    Dernier message: 26/04/2004, 15h27

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