Question

Je connais bien le problème à l'origine de ORA-01775: chaîne de synonymes en boucle, mais y a-t-il un problème à résoudre pour le déboguer, ou dois-je simplement "créer ou remplacer" ma sortie de là?

Existe-t-il un moyen d'interroger le schéma ou quoi que ce soit pour savoir quelle est la définition actuelle d'un synonyme public?

Encore plus génial serait un outil graphique, mais à ce stade, tout serait utile.

Était-ce utile?

La solution

En réalité, le problème n'était pas vraiment une chaîne de synonymes en boucle, mais le fait que le synonyme désignait une vue qui n'existait pas.

Oracle apparaît apparemment comme une chaîne en boucle dans cet état.

Autres conseils

Si vous utilisez TOAD, accédez à Afficher > Options de crapaudage > Oracle > Général, puis supprimez TOAD_PLAN_TABLE de la section EXPLAIN PLAN et insérez PLAN_TABLE

.

La table de dictionnaire de données DBA_SYNONYMS contient des informations sur tous les synonymes d'une base de données. Pour que vous puissiez exécuter la requête

SELECT table_owner, table_name, db_link
  FROM dba_synonyms 
 WHERE owner        = 'PUBLIC'
   AND synonym_name = <<synonym name>>

pour voir ce que le synonyme public pointe actuellement.

La solution moins intuitive à ce code d'erreur semble être le problème des objets pointés par le synonyme.

Voici mon code SQL pour rechercher des synonymes qui pointent vers des objets erronés.

SELECT S.OWNER as SYN_OWNER, S.SYNONYM_NAME as SYN_NAME,
    S.TABLE_OWNER as OBJ_OWNER, S.TABLE_NAME as OBJ_NAME,
    CASE WHEN O.OWNER is null THEN 'MISSING' ELSE O.STATUS END as OBJ_STATUS
FROM DBA_SYNONYMS S
    LEFT JOIN DBA_OBJECTS O ON S.TABLE_OWNER = O.OWNER AND S.TABLE_NAME = O.OBJECT_NAME
WHERE O.OWNER is null
    OR O.STATUS != 'VALID';

Essayez cette sélection pour trouver les synonymes problématiques. Elle répertorie tous les synonymes pointant vers un objet inexistant (tables, vues, séquences, packages, procédures, fonctions)

SELECT *
FROM dba_synonyms
WHERE table_owner = 'USER'
    AND (
        NOT EXISTS (
            SELECT *
            FROM dba_tables
            WHERE dba_synonyms.table_name = dba_tables.TABLE_NAME
            )
        AND NOT EXISTS (
            SELECT *
            FROM dba_views
            WHERE dba_synonyms.table_name = dba_views.VIEW_NAME
            )
        AND NOT EXISTS (
            SELECT *
            FROM dba_sequences
            WHERE dba_synonyms.table_name = dba_sequences.sequence_NAME
            )
        AND NOT EXISTS (
            SELECT *
            FROM dba_dependencies
            WHERE type IN (
                    'PACKAGE'
                    ,'PROCEDURE'
                    ,'FUNCTION'
                    )
                AND dba_synonyms.table_name = dba_dependencies.NAME
            )
        )

Aujourd'hui, j'ai eu cette erreur et après le débogage, j'ai découvert que les tables manquaient, ce à quoi je faisais référence en utilisant des synonymes. Je suggère donc - vérifiez d’abord si les tables existent! : -))

Un développeur a accidentellement écrit du code qui a généré et exécuté l'instruction SQL suivante CRÉER OU REMPLACER LE SYNONYME PUBLIC "DUAL "" POUR "DUAL" ayant provoqué , sélectionnez * à partir de dba_synonymes où nom_table = 'DUAL'; pour renvoyer PUBLIC DUAL SOME_USER DUAL plutôt que PUBLIC DUAL SYS DUAL .

Nous avons pu résoudre ce problème (merci à Comment recréer un synonyme public "quot. double" ;? ) en exécutant

ALTER SYSTEM SET "_SYSTEM_TRIG_ENABLED"=FALSE SCOPE=MEMORY;
CREATE OR REPLACE PUBLIC SYNONYM DUAL FOR SYS.DUAL;
ALTER SYSTEM SET "_SYSTEM_TRIG_ENABLED"=true SCOPE=MEMORY;

J'ai eu un problème similaire, dû à l'absence de guillemets dans la table et le nom du schéma.

Nous avons eu la même erreur ORA-01775, mais dans notre cas, l'utilisateur du schéma ne disposait pas de 'subvention à sélectionner' sur quelques synonymes publics.

Étape 1) Voir quels objets existent avec le nom:

select * from all_objects where object_name = upper('&object_name');

Il se peut qu’un synonyme existe mais qu’il n’existe pas de table?

Étape 2) Si ce n'est pas le problème, recherchez le synonyme:

select * from all_synonyms where synonym_name = upper('&synonym_name');

Il se peut qu'une table ou une vue sous-jacente à ce synonyme soit manquante?

Nous avons rencontré cette erreur aujourd'hui. Voici comment nous l'avons débogué et corrigé.

  1. Le paquet est devenu invalide en raison de l'erreur ORA-01775 .

  2. Avec le numéro de ligne d'erreur, nous avons examiné le code du corps de package et avons trouvé le code qui essayait d'insérer des données dans une table .

  3. Nous avons exécuté les requêtes ci-dessous pour vérifier si la table et le synonyme ci-dessus existaient.

    SELECT * FROM DBA_TABLES WHERE TABLE_NAME = '&TABLE_NAME';  -- No rows returned
    
    SELECT * FROM DBA_SYNONYMS WHERE SYNONYM_NAME = '&SYNONYM_NAME'; -- 1 row returned
    
  4. Ceci nous a permis de conclure que le tableau devait être recréé. Le synonyme désignant une table inexistante.

  5. L'équipe DBA a recréé la table, ce qui a résolu le problème.

ORA-01775: Chaîne en boucle de synonymes J'ai rencontré l'erreur ci-dessus alors que j'essayais de compiler un package qui utilisait un objet pour lequel un synonyme avait été créé, mais l'objet sous-jacent n'était pas disponible.

J'utilise le SQL suivant pour rechercher des entrées dans tous les synonymes où il n'y a pas d'objet correspondant pour le nom d'objet (dans objets_utilisateur):

 select * 
   from all_synonyms 
   where table_owner = 'SCOTT' 
     and synonym_name not like '%/%'
     and table_name not in (
       select object_name from user_objects
         where object_type in (
           'TABLE', 'VIEW', 'PACKAGE', 'SEQUENCE',
           'PROCEDURE', 'FUNCTION', 'TYPE'
         )
    );

Bien que la réponse de Jarrod soit une bonne idée et attrape un plus grand nombre de problèmes connexes, j'ai trouvé cette requête trouvée dans les forums Oracle pour résoudre plus directement le problème (énoncé à l'origine):

select owner, synonym_name, connect_by_iscycle CYCLE
from dba_synonyms
where connect_by_iscycle > 0
connect by nocycle prior table_name = synonym_name
and prior table_owner = owner
union
select 'PUBLIC', synonym_name, 1
from dba_synonyms
where owner = 'PUBLIC'
and table_name = synonym_name
and (table_name, table_owner) not in (select object_name, owner from dba_objects
where object_type != 'SYNONYM')

https://community.oracle.com/message/4176300#4176300

Vous n'aurez pas à parcourir d'autres types d'objets non valides. Juste ceux qui sont réellement dans des boucles sans fin.

http://ora-01775.ora-code.com/ suggère:

ORA-01775 : enchaînement de synonymes

Cause : Une série d'instructions de synonyme CREATE a défini un synonyme qui se réfère à lui-même. Par exemple, les définitions suivantes sont circulaires:
CREATE SYNONYM s1 pour s2 CREATE SYNONYM s2 pour s3 CREATE SYNONYM s3 pour s1
Action : modifiez une définition de synonyme afin qu'elle s'applique à une table ou à une vue de base, puis renouvelez l'opération.

Si vous compilez une PROCEDURE, il est possible que cela se réfère à une table ou à une vue qui n’existe pas car elle est créée dans la même PROCEDURE. Dans ce cas, la solution consiste à déclarer la requête déclarée sous forme de chaîne, par exemple v_query: = 'insérer dans la table select * from table2 , puis exécuter immédiatement sur v_query ;

.

Cela est dû au fait que le compilateur ne reconnaît pas encore l’objet et ne trouve donc pas la référence. Salutations.

J'avais une fonction définie dans le mauvais schéma et sans synonyme public. C'est à dire. mon proc était dans le schéma " Chiens " et la fonction était dans le schéma "Chats". La fonction ne contenait pas de synonyme public permettant aux chiens d'accéder à la fonction des chats.

Pour moi, le nom de la table et le synonyme existaient tous les deux, mais sous des noms de propriétaires différents. J'ai recréé les tables sous le nom du propriétaire qui correspond au nom du propriétaire en synonymes.

J'ai utilisé les requêtes envoyées par @ Mahi_0707

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top