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

Administration Oracle Discussion :

La vue all_synonym contient des synonymes qui n'existent pas


Sujet :

Administration Oracle

  1. #1
    Membre régulier Avatar de bankette
    Homme Profil pro
    Chef de Projet Web
    Inscrit en
    Mars 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de Projet Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2007
    Messages : 135
    Points : 89
    Points
    89
    Par défaut La vue all_synonym contient des synonymes qui n'existent pas
    Bonjour a tous

    Voila, j'ai un petit souci avec Oracle 10G.
    Mon problème est assez simple, j'ai un script de nettoyage de schémas qui après avoir supprimer mes schémas, suppriment tous les synonymes associés.

    Prenons un exemple pour expliquer mon problème :
    Dans la table all_synonym j'ai le synonym "toto" avec un owner "bankette", je viens de supprimer le schéma bankette ainsi que toutes les tables lui appartenant.
    Lorsque je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    drop public synonym bankette.toto;
    -- public synonym to be dropped doesn't exist
    Du coup vu que je suis dans un script automatique, ça plante...

    Est ce que vous sauriez :
    1. Comment je peux avoir un synonyme qui n'existe pas?
    2. Comment je peux le supprimer de cette vue?

    Merci d'avance ,
    Julien

  2. #2
    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
    Points : 3 597
    Points
    3 597
    Par défaut
    Vérifiez qu'il s'agit bien d'un synonyme publique et non d'un synonyme privé.

    Pouvez-vous reproduire le problème avec un petit script et poster ce script et son exécution ?

  3. #3
    Membre régulier Avatar de bankette
    Homme Profil pro
    Chef de Projet Web
    Inscrit en
    Mars 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de Projet Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2007
    Messages : 135
    Points : 89
    Points
    89
    Par défaut
    Voici le script en question :
    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
     
    declare
     
    oneDropStatement varchar2(100) ;
     
     
    cursor dropStatement is 
    select 'drop user ' || usr.username || ' cascade' as exec from all_users usr
    where  usr.username like '%DBA'
    union all
    SELECT
    (CASE
    WHEN owner = 'PUBLIC'
    THEN 'drop public synonym '||synonym_name
    Else
    'drop synonym '||owner||'.'||synonym_name
    END)  as exec
    FROM all_synonyms
    WHERE (table_owner LIKE '%DBA');
     
    begin
    for oneStatement in dropStatement loop
    begin
         oneDropStatement := oneStatement.exec;
         dbms_output.put_line(oneDropStatement);
         execute immediate oneDropStatement ;
    end ;
    end loop ;
     
    end ;
     
    /
     
    exit ;
    Donc le probleme du public qui est peut etre privé ne se pose pas, car il est defini comme public dans la table all_synonym.

    Merci pour la reponse rapide !

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 316
    Points : 388
    Points
    388
    Par défaut
    bonjour,
    j'ai peut-être loupé un truc mais d'apres le script vous ne devriez pas avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DROP public synonym bankette.toto;
    puisque le owner est mis que si il est different de PUBLIC

  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
    Points : 3 597
    Points
    3 597
    Par défaut
    Il faut bien supprimer le synonyme publique après avoir supprimé le schéma et comme déjà dit sans préfixer le synonyme publique par le nom du schéma puisqu'un synonyme publique est un objet global qui n'appartient pas à un schéma donné:


    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
     
    SQL> select * from v$version;
     
    BANNER
    ----------------------------------------------------------------
    Oracle Database 10g Express Edition Release 10.2.0.1.0 - Product
    PL/SQL Release 10.2.0.1.0 - Production
    CORE    10.2.0.1.0      Production
    TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
    NLSRTL Version 10.2.0.1.0 - Production
     
    SQL> drop user test cascade;
    drop user test cascade
              *
    ERROR at line 1:
    ORA-01918: user 'TEST' does not exist
     
     
    SQL> drop public synonym t;
    drop public synonym t
                        *
    ERROR at line 1:
    ORA-01432: public synonym to be dropped does not exist
     
     
    SQL>
    SQL> create user test identified by test quota unlimited on users default tables
    pace users;
     
    User created.
     
    SQL> grant create session, create table, create public synonym to test;
     
    Grant succeeded.
     
    SQL>
    SQL>
    SQL> connect test/test;
    Connected.
    SQL> create table t(x int);
     
    Table created.
     
    SQL> create public synonym t for t;
     
    Synonym created.
     
    SQL>
    SQL> connect / as sysdba
    Connected.
    SQL> drop user test cascade;
     
    User dropped.
     
    SQL> select owner, synonym_name from dba_synonyms where synonym_name='T';
     
    OWNER                          SYNONYM_NAME
    ------------------------------ ------------------------------
    PUBLIC                         T
     
    SQL> drop public synonym test.t;
    drop public synonym test.t
                            *
    ERROR at line 1:
    ORA-00933: SQL command not properly ended
     
     
    SQL> drop public synonym t;
     
    Synonym dropped.

  6. #6
    Membre régulier Avatar de bankette
    Homme Profil pro
    Chef de Projet Web
    Inscrit en
    Mars 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de Projet Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2007
    Messages : 135
    Points : 89
    Points
    89
    Par défaut
    Ouups !!!

    Désolé, c'est moi, en fait mon script retourne la commande suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DROP public synonym toto;
    -- public synonym to be dropped doesn't exist
    Il n'y a pas de owner, désolé pour l'erreur.

    Donc le synonyme public toto existe dans all_synonyms mais n'existe pas en réalité, c'est la mon problème.

    Merci,
    Julien

  7. #7
    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
    Points : 3 597
    Points
    3 597
    Par défaut
    1. Comment je peux avoir un synonyme qui n'existe pas?
    Ce n'est pas possible. C'est un bug dans votre code ou un bug Oracle.

    2. Comment je peux le supprimer de cette vue?
    Il faut utiliser DROP PUBLIC SYNONYM.

    Essayez de poster un scénario complet avec création des objets, synonymes et suppression du schéma et des synonymes qui reproduit votre problème sans utiliser votre code PL/SQL qui fait tout: ceci devrait permettre de trouver plus facilement la cause du problème. Merci de préciser aussi votre version Oracle avec 4 chiffres.

  8. #8
    Membre régulier Avatar de bankette
    Homme Profil pro
    Chef de Projet Web
    Inscrit en
    Mars 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de Projet Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2007
    Messages : 135
    Points : 89
    Points
    89
    Par défaut
    Bonjour pifor,

    Voici le scénario :

    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
     
    SQL> select  'drop public synonym '||synonym_name||';'
    FROM all_synonyms
    WHERE owner = 'PUBLIC'
    and (table_owner LIKE '%DBA');
     
         drop public synonym TestABC;
         1 row selected
     
    SQL>   drop public synonym TestABC;
    Error starting at line 1 in command:
    drop public synonym TestABC
    Error report:
    SQL Error: ORA-01432: public synonym to be dropped does not exist
    01432. 00000 -  "public synonym to be dropped does not exist"
    *Cause:    
    *Action:
    Je n'ai pas la moindre idée du ou ni du comment le synonyme TestABC a été créé, mais il est dans la tables all_synonyms....

    Ce serai un bug oracle vraiment? Je n'ai pas un moyen de l'enlever de la vue all_synonyms?

    Merci,
    Julien

  9. #9
    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
    Points : 3 597
    Points
    3 597
    Par défaut
    Ce que j'entends par scénario complet c'est un script où le synonyme est créé ET supprimé ...

    Quelle est la version exacte Oracle utilisée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from v$version;
    Que donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select * from all_synonyms where synonym_name='TESTABC';
    select * from all_synonyms where synonym_name='TestABC';

  10. #10
    Membre régulier Avatar de bankette
    Homme Profil pro
    Chef de Projet Web
    Inscrit en
    Mars 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de Projet Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2007
    Messages : 135
    Points : 89
    Points
    89
    Par défaut
    Je ne sais pas comment il a été créé, il est la et il m'embete beaucoup... Ce que je souhaite c'est le supprimer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
    PL/SQL Release 10.2.0.4.0 - Production
    "CORE    10.2.0.4.0    Production"
    TNS for Linux: Version 10.2.0.4.0 - Production
    NLSRTL Version 10.2.0.4.0 - Production
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT * FROM all_synonyms WHERE synonym_name='TestABC';
     
    OWNER                          SYNONYM_NAME                   TABLE_OWNER                    TABLE_NAME                     DB_LINK                                                                                                                          
    ------------------------------ ------------------------------ ------------------------------ ------------------------------ -------------------------------------------------------------------------------------------------------------------------------- 
    PUBLIC                         TestABC                       VPRDBA                         TESTABC       
     
    1 rows selected
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT * FROM all_synonyms WHERE synonym_name='TESTABC';
     
     
     
    OWNER                          SYNONYM_NAME                   TABLE_OWNER                    TABLE_NAME                     DB_LINK                                                                                                                          
    ------------------------------ ------------------------------ ------------------------------ ------------------------------ -------------------------------------------------------------------------------------------------------------------------------- 
     
    0 rows selected
    Voila j'espere avoir apporté toutes les précisions nécessaires....

  11. #11
    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
    Points : 3 597
    Points
    3 597
    Par défaut
    Il semble que le synonyme a été créé avec les "" pour être stocké en minuscules dans le dictionnaire:

    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
    SQL> create public synonym "t" for t;
     
    Synonym created.
     
    SQL> select * from all_synonyms where synonym_name='t';
     
    OWNER                          SYNONYM_NAME
    ------------------------------ ------------------------------
    TABLE_OWNER                    TABLE_NAME
    ------------------------------ ------------------------------
    DB_LINK
    --------------------------------------------------------------------------------
     
    PUBLIC                         t
    TEST                           T
     
     
     
    SQL> drop public synonym t;
    drop public synonym t
                        *
    ERROR at line 1:
    ORA-01432: public synonym to be dropped does not exist
     
    SQL> drop public synonym "t";
     
    Synonym dropped.
     
    SQL>
    Dans ce cas il faut aussi utiliser les "" pour le supprimer.

    Voir ce que la doc à ce sujet:
    http://download.oracle.com/docs/cd/B....htm#sthref723

    Nonquoted identifiers are not case sensitive. Oracle interprets them as uppercase. Quoted identifiers are case sensitive.

  12. #12
    Membre régulier Avatar de bankette
    Homme Profil pro
    Chef de Projet Web
    Inscrit en
    Mars 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de Projet Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2007
    Messages : 135
    Points : 89
    Points
    89
    Par défaut
    Super ça fonctionne !!!!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Drop public synonym "TestABC";
    Et hop, a plus mon synonyme.

    Un grand merci !!

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

Discussions similaires

  1. Retourner des enregistrements qui n'existent pas
    Par Cryos dans le forum Développement
    Réponses: 2
    Dernier message: 31/01/2014, 11h15
  2. insertion des numéros qui n'existe pas dans la base de données
    Par cisco.nat dans le forum Général Java
    Réponses: 5
    Dernier message: 09/07/2013, 12h39
  3. Réponses: 1
    Dernier message: 11/05/2011, 14h38
  4. [XSL][re] Ecrire des balise qui ne seront pas interpretées
    Par FrRoulio dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 17/03/2004, 12h32
  5. la liste des clients qui n'ont pas acheter aucun article ...
    Par TéBeSsI dans le forum Langage SQL
    Réponses: 6
    Dernier message: 13/02/2004, 14h57

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