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 :

Interférence entre nom schéma et nom synonyme


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 5
    Par défaut Interférence entre nom schéma et nom synonyme
    Bonjour tout le monde,


    J'utilise une procédure qui me permet de reconstruire les "unbalanced index". Cette procédure d'administration appartient à un schéma qui s'appelle ADM et tous les users de la base peuvent l'exécuter.

    Or depuis la dernière installation applicative sur cette base je me retrouve avec l'erreur suivante sur le schéma applicatif :


    BEGIN adm.RebuildUnbalancedIndexes; END;


    *

    ERREUR à la ligne 1 :

    ORA-06550: Ligne 1, colonne 11 :

    PLS-00302: Le composant 'REBUILDUNBALANCEDINDEXES' doit être déclaré
    En poussant l'analyse, j'ai constaté que la nouvelle version applicative a créé un synonyme sur une table qui porte le même nom que mon schéma à qui appartient la procédure de reconstruction des index.

    Apparemment Oracle se fourche car on peut avoir :
    adm.adm_id (nom_syn.nom_col)
    ou
    adm.RebuildUnbalancedIndexes (nom_schéma.nom_proc)


    Comment se dépatouiller sans changer le nom du schéma ou le nom du synonyme ??? Y a-t-il un moyen pour indiquer à Oracle que c'est ma syntaxe c'est schéma.proc et pas syn.col ???



    J'ai fait un test en créant un autre schéma ADM_DBA qui contient la procédure et là aucun soucis, mais malheureusement nous ne pouvons pas changer cela sur la base de production il y aurait trop d'impact.

  2. #2
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 462
    Par défaut
    Citation Envoyé par lamawa Voir le message
    Comment se dépatouiller sans changer le nom du schéma ou le nom du synonyme ??? Y a-t-il un moyen pour indiquer à Oracle que c'est ma syntaxe c'est schéma.proc et pas syn.col ???
    Bonjour

    A ma connaissance il n'y a aucune possibilité pour ça.
    Dans une syntaxe X.Y, X sera toujours recherché en premier dans le schéma local. Si un synonyme s'appelle X, c'est lui qui gagne par rapport à un nom de schéma X.

    Le point 7 dans cette doc http://download.oracle.com/docs/cd/B....htm#sthref723 précise le découpage des différents espaces de nommage, mais je n'ai pas réussi à (re)trouver d'information explicite sur les règles de priorité.

    Au fait, par curiosité, comment identifiez-vous les index prétendument déséquilibrés ?

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Citation Envoyé par Pomalaix Voir le message
    Le point 7 dans cette doc http://download.oracle.com/docs/cd/B....htm#sthref723 précise le découpage des différents espaces de nommage, mais je n'ai pas réussi à (re)trouver d'information explicite sur les règles de priorité.
    Les règles de résolution des noms des objets sont définies ici:
    http://download.oracle.com/docs/cd/B....htm#sthref745

  4. #4
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 462
    Par défaut
    Citation Envoyé par pifor Voir le message
    Les règles de résolution des noms des objets sont définies ici:
    http://download.oracle.com/docs/cd/B....htm#sthref745

    Merci Pifor !
    Vous êtes décidément le grand maître ès recherche dans la doc !

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    J'arrive bien à reproduire le problème avec un synonyme privé et même avec un package. Par contre, le problème semble pouvoir être contourné si on transforme la procédure en une fonction et si on appelle la fonction avec SELECT:

    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    SQL> select * from v$version;
     
    BANNER
    ----------------------------------------------------------------
    Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
    PL/SQL Release 10.2.0.1.0 - Production
    CORE	10.2.0.1.0	Production
    TNS for Linux: Version 10.2.0.1.0 - Production
    NLSRTL Version 10.2.0.1.0 - Production
     
    SQL> drop user adm cascade;
     
    Utilisateur supprime.
     
    SQL> create user adm identified by adm quota unlimited on users;
     
    Utilisateur cree.
     
    SQL> grant create session, create table, create synonym, create procedure to adm ;
     
    Autorisation de privileges (GRANT) acceptee.
     
    SQL> connect adm/adm
    Connecte.
    SQL> create table t(x varchar2(10));
     
    Table creee.
     
    SQL> insert into t values('table adm');
     
    1 ligne creee.
     
    SQL> create synonym adm for t;
     
    Synonyme cree.
     
    SQL> 
    SQL> create procedure p
      2  authid current_user
      3  as
      4  begin
      5  dbms_output.put_line('adm.p');
      6  end;
      7  /
     
    Procedure creee.
     
    SQL> show errors
    Pas d erreur.
    SQL> 
    SQL> create function f return number
      2  authid current_user
      3  as
      4  begin
      5  dbms_output.put_line('adm.f');
      6  return 0;
      7  end;
      8  /
     
    Fonction creee.
     
    SQL> create package pp
      2  authid current_user
      3  is
      4  procedure p;
      5  end;
      6  /
     
    Package cree.
     
    SQL> show errors
    Pas d erreur.
    SQL> 
    SQL> create package body pp
      2  is
      3  procedure p
      4  as
      5  begin
      6  dbms_output.put_line('adm.p');
      7  end;
      8  end;
      9  /
     
    Corps de package cree.
     
    SQL> show errors
    Pas d erreur.
    SQL> grant select on t to test;
     
    Autorisation de privileges (GRANT) acceptee.
     
    SQL> grant execute on p to test;
     
    Autorisation de privileges (GRANT) acceptee.
     
    SQL> connect adm/adm
    Connecte.
    SQL> set serveroutput on
    SQL> exec adm.p;
    BEGIN adm.p; END;
     
              *
    ERREUR a la ligne 1 :
    ORA-06550: Ligne 1, colonne 11 :
    PLS-00302: Le composant 'P' doit etre declare
    ORA-06550: Ligne 1, colonne 7 :
    PL/SQL: Statement ignored
     
     
    SQL> exec adm.pp.p;
    BEGIN adm.pp.p; END;
     
              *
    ERREUR a la ligne 1 :
    ORA-06550: Ligne 1, colonne 11 :
    PLS-00302: Le composant 'PP' doit etre declare
    ORA-06550: Ligne 1, colonne 7 :
    PL/SQL: Statement ignored
     
     
    SQL> select adm.f from dual;
     
    	 F
    ----------
    	 0
     
    adm.f

  6. #6
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 5
    Par défaut
    Citation Envoyé par pifor Voir le message
    J'arrive bien à reproduire le problème avec un synonyme privé et même avec un package. Par contre, le problème semble pouvoir être contourné si on transforme la procédure en une fonction et si on appelle la fonction avec SELECT:

    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    SQL> select * from v$version;
     
    BANNER
    ----------------------------------------------------------------
    Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
    PL/SQL Release 10.2.0.1.0 - Production
    CORE	10.2.0.1.0	Production
    TNS for Linux: Version 10.2.0.1.0 - Production
    NLSRTL Version 10.2.0.1.0 - Production
     
    SQL> drop user adm cascade;
     
    Utilisateur supprime.
     
    SQL> create user adm identified by adm quota unlimited on users;
     
    Utilisateur cree.
     
    SQL> grant create session, create table, create synonym, create procedure to adm ;
     
    Autorisation de privileges (GRANT) acceptee.
     
    SQL> connect adm/adm
    Connecte.
    SQL> create table t(x varchar2(10));
     
    Table creee.
     
    SQL> insert into t values('table adm');
     
    1 ligne creee.
     
    SQL> create synonym adm for t;
     
    Synonyme cree.
     
    SQL> 
    SQL> create procedure p
      2  authid current_user
      3  as
      4  begin
      5  dbms_output.put_line('adm.p');
      6  end;
      7  /
     
    Procedure creee.
     
    SQL> show errors
    Pas d erreur.
    SQL> 
    SQL> create function f return number
      2  authid current_user
      3  as
      4  begin
      5  dbms_output.put_line('adm.f');
      6  return 0;
      7  end;
      8  /
     
    Fonction creee.
     
    SQL> create package pp
      2  authid current_user
      3  is
      4  procedure p;
      5  end;
      6  /
     
    Package cree.
     
    SQL> show errors
    Pas d erreur.
    SQL> 
    SQL> create package body pp
      2  is
      3  procedure p
      4  as
      5  begin
      6  dbms_output.put_line('adm.p');
      7  end;
      8  end;
      9  /
     
    Corps de package cree.
     
    SQL> show errors
    Pas d erreur.
    SQL> grant select on t to test;
     
    Autorisation de privileges (GRANT) acceptee.
     
    SQL> grant execute on p to test;
     
    Autorisation de privileges (GRANT) acceptee.
     
    SQL> connect adm/adm
    Connecte.
    SQL> set serveroutput on
    SQL> exec adm.p;
    BEGIN adm.p; END;
     
              *
    ERREUR a la ligne 1 :
    ORA-06550: Ligne 1, colonne 11 :
    PLS-00302: Le composant 'P' doit etre declare
    ORA-06550: Ligne 1, colonne 7 :
    PL/SQL: Statement ignored
     
     
    SQL> exec adm.pp.p;
    BEGIN adm.pp.p; END;
     
              *
    ERREUR a la ligne 1 :
    ORA-06550: Ligne 1, colonne 11 :
    PLS-00302: Le composant 'PP' doit etre declare
    ORA-06550: Ligne 1, colonne 7 :
    PL/SQL: Statement ignored
     
     
    SQL> select adm.f from dual;
     
    	 F
    ----------
    	 0
     
    adm.f


    Seul petit problème avec une fonction : je ne crois pas qu'on puisse y exécuter de l'ordre DDL.

    Je crois que je vais arriver à la solution de renommer le schéma ADM et éviter ainsi que le synonyme de l'applicatif ne porte le même nom.

  7. #7
    Membre Expert Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Par défaut
    Bonjour,

    pas possible apparemment

    note oracle 399983.1

    sans supprimmer ou renommer le synonym ou le schema !!!

    sauf en version 9.2.0.6, 9.2.0.7 !!!

  8. #8
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    éventuellement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    alter session set current_schema=adm;
    BEGIN RebuildUnbalancedIndexes; END;
    /

  9. #9
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 5
    Par défaut
    Merci pour vos réponses.

    @fatsora,
    j'avais zappé la note oracle 399983.1


    @laurentschneider,
    la solution semblait alléchante mais maheureusement dans ma proc
    CREATE OR REPLACE PROCEDURE ADM.RebuildUnbalancedIndexes
    (pMaxHeight integer := 3,
    pMaxLeafsDeleted integer := 20)
    AUTHID CURRENT_USER
    IS
    j'utilise AUTHID CURRENT_USER qui doit représenter le schéma de l'applicatif et pas ADM donc ...

    Il ne reste donc apparemment que renommer le schéma ou le synonyme à moins que qq'un a encore une autre idée ?

Discussions similaires

  1. Lien entre deux champs de noms différents
    Par Erielle dans le forum QlikView
    Réponses: 4
    Dernier message: 27/05/2013, 09h55
  2. [Toutes versions] ALEA.ENTRE.BORNES - Générer des noms, prénoms et dates aléatoires
    Par Philippe Tulliez dans le forum Contribuez
    Réponses: 0
    Dernier message: 26/05/2013, 19h00
  3. Form avec plusieurs entrées d'un même nom
    Par Clive40 dans le forum Langage
    Réponses: 4
    Dernier message: 18/03/2013, 17h12
  4. Problème "Espace de nom" schéma XML
    Par chtrousselle dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 27/06/2011, 11h00
  5. Lien entre v$sql_area et nom du user
    Par farenheiit dans le forum Administration
    Réponses: 6
    Dernier message: 17/03/2009, 11h49

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