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 :

Sécurité granulaire et connect by


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 12
    Par défaut Sécurité granulaire et connect by
    Bonjour, je travaille actuellement avec les sécurités granulaires RLS et je rencontre un problème de taille :
    je construis le prédicat avec une procédure pl/sql sous la forme :
    colonne in (select valeur from matable)

    cela marche impec sauf !!! pour les requêtes récursives du type :
    select mere,fils,valeur from table_hierarchique start with mere is null connect by prior fils=mere;

    je reçois l'erreur : ora-01473 : Subqueries cannot be used in a CONNECT BY clause

    mais si je lance la requête à la main en plaçant le where entre la table et le start with... :
    select mere,fils,valeur from table_hierarchique where fils in (select valeur from matable) start with mere is null connect by prior fils=mere;

    tout ce passe bien dans ce cas

    Alors est-ce un bug de RLS ou pas ?

    si quelqu'un a déjà rencontré le problème et trouver une solution, je suis prêt à le vénérer comme un dieu

    Merci.

  2. #2
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Salut,

    L'explication d'Oracle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ORA-01473: cannot have subqueries in CONNECT BY clause 
    Cause: Subqueries cannot be used in a CONNECT BY clause. 
    Action: Remove the subquery or move it to the WHERE clause.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 12
    Par défaut
    Et c'est bien là tout le problème, étant donné que je passe par un prédicat RLS, je n'ai pas la possibilité de placer où je veux ce petit bout de code.

    j'ai testé la requête suivante sans policy sur la table_hierarchique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select mere,fils,valeur from table_hierarchique 
    where fils in (select valeur from matable)
     start with mere is null connect by prior fils=mere;
    qui me donne bien le bon résultat.

    Mais normalement, le fonctionnement de RLS veut que en tapant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select mere,fils,valeur from table_hierarchique 
    start with mere is null connect by prior fils=mere;
    apres avoir positionné une sécurité sur la table_hierarchique [ via : dbms_rls.add_policy(schema, 'table_hierarchique', nom_de_la_securite,proprio, fonction_plsql); ]
    si la fonction_plsql retourne un varchar2, on applique cette chaine comme condition du where associé à la table.

    Et je sais que la chaine est bonne puisque sans la partie start with ... connect by ..., j'ai bien les bon enregistrements.

    D'ou mon interrogation sur l'existence d'un contournement pour que RLS place le where au bonne endroit.

  4. #4
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    SALUT,

    Essaie d'exécuter ce code avec sql
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT     mere, fils, valeur
          FROM (SELECT *
                  FROM table_hierarchique
                 WHERE fils IN (SELECT valeur
                                  FROM matable)) table_hierarchique
    START WITH mere IS NULL
    CONNECT BY PRIOR fils = mere;
    est ce qu'il génère une erreur?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 12
    Par défaut
    ouais, j'ai la même erreur oracle et ceci, même sans les policy

    donc c'est pas vraiment le top, mais merci quand même d'avoir essayé.

    mais la requête me gênait parce que on a le prédicat dedans, et si je passe par RLS, c'est justement pour pas avoir ce prédicat dans la requête car il est dynamique.

    On verra bien si des gens ont d'autres idées, j'en profite pour préciser que je teste sur oracle8 en ce moment, je devrai pouvoir faire les tests sur oracle 9 et 10 d'ici quelques jours pour voir si le problème disparait avec les évolutions ...
    En attendant j'ai mis en place l'alternative d'un prédicat de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    valeur in(val1,val2, ... , valn)
    même si c'est limité à 255 valeurs du coup.

    vu que pour l'instant on développe un prototype de l'application final...

    encore merci pour avoir pris le temps de regarder mon problème.

  6. #6
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    salut,
    Je pense que c'est un problème de version, en 10g j'ai réussi à exécuter cette requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT     *
          FROM (SELECT *
                  FROM emp
                 WHERE deptno <= 100) emp
    CONNECT BY empno = mgr

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 12
    Par défaut
    Bon alors ca fait un moment, mais j'ai la réponse a ma question ,
    Je viens de terminer les tests sur une base oracle9i, et la même requête fonctionne, c'est donc bien un problème de version.
    J'en ai profité pour faire les tests sur une version 10g et ca marche aussi (ouf)

    C'est donc avec une grande émotion que je clos ce topic

    Merci à salim11

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 31/07/2014, 17h02
  2. Sécurité Granulaire (DBMS_RLS)
    Par bar_79 dans le forum PL/SQL
    Réponses: 5
    Dernier message: 19/08/2010, 17h51
  3. Sécurité d'une connection via l'API mysql
    Par Pgs dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 19/10/2007, 10h46
  4. Réponses: 2
    Dernier message: 22/01/2006, 19h35
  5. Réponses: 7
    Dernier message: 18/07/2005, 13h42

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