web-dev-qa-db-fra.com

Comment déboguer ORA-01775: chaîne de synonymes en boucle?

Je connais bien le problème sous-jacent à ORA-01775: une chaîne de synonymes en boucle, mais y a-t-il une astuce pour le déboguer ou dois-je simplement "créer ou remplacer" mon moyen de le sortir? 

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.

41
Josh Kodroff

En réalité, le problème n'était pas 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 cette situation.

65
Josh Kodroff

Si vous utilisez TOAD, sélectionnez Affichage> Options de crapaud> Oracle> Général et supprimez TOAD_PLAN_TABLE de la section EXPLAIN PLAN et mettez PLAN_TABLE.

26
LJT

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.

22
Justin Cave

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

Voici mon SQL pour trouver 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';
14
Jarrod Chesney

Essayez cette sélection pour trouver les synonymes problématiques, elle répertorie tous les synonymes qui pointent vers un objet qui n’existe pas (tables, vues, séquences, packages, procédures, fonctions).

SELECT *
FROM dba_synonyms
WHERE table_owner = 'SYSADM'
    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
            )
        )
5

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. Donc, je suggère - vérifiez d’abord que les tables existent! :-))

3
Alan

Un développeur a accidentellement écrit du code qui a généré et exécuté l'instruction SQL suivante CREATE OR REPLACE PUBLIC SYNONYM "DUAL" FOR "DUAL"; qui a amené select * from dba_synonyms where table_name = 'DUAL'; à renvoyer PUBLIC DUAL SOME_USER DUAL plutôt que PUBLIC DUAL SYS DUAL.

Nous avons pu résoudre ce problème (grâce à Comment recréer le synonyme public "DUAL"? ) 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;
2
Tim Lewis

J'ai eu un problème similaire, qui s'est avéré être causé par l'absence de guillemets doubles dans la table et le nom du schéma.

1
Jamie Kitson

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

1
Guy

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

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

Il se pourrait qu'un synonyme existe mais pas de table?


Étape 2) Si ce n'est pas le problème, étudiez 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?

1
grokster

Nous avons rencontré cette erreur aujourd'hui. Voici comment nous l'avons corrigé 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 parcouru le code du corps package et avons trouvé le code qui tentait d'insérer des données dans un table.

  3. Nous avons exécuté ci-dessous des requêtes pour vérifier si les table et synonym 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. Avec cela, nous avons conclu que la table doit être recréée. Comme le synonym désignait un table qui n’existait pas.

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

1
Mahi_0707

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 adresser plus directement le problème (initialement indiqué):

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.

0
Justin

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

 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'
         )
    );
0
wmorrison365

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.

0
Nitin Guru