Comment déboguer ORA-01775: chaîne bouclée de synonymes?

je suis familier avec la question derrière ORA-01775: chaîne bouclée de synonymes, mais y a-t-il une astuce pour le déboguer, ou dois-je juste "créer ou remplacer" mon chemin de sortie de celui-ci?

Est-il un moyen d'interroger le schéma ou que ce soit pour savoir ce que la définition actuelle d'un synonyme public?

Encore plus impressionnant serait un outil graphique, mais à ce point, tout serait utile.

41
demandé sur kennytm 2008-10-29 17:50:03

17 réponses

comme il s'avère, le problème n'était pas réellement une chaîne de boucles de synonymes, mais le fait que le synonyme pointait vers une vue qui n'existait pas.

Oracle se trompe apparemment comme chaîne en boucle dans cet état.

64
répondu Josh Kodroff 2008-10-29 17:09:35

si vous utilisez crapaud, allez à vue>Options de Crapaud>Oracle>Généralités et supprimez CRAPAUD_PLAN_TABLE de la section expliquer le PLAN et mettez PLANIF_TABLE

26
répondu LJT 2013-04-19 05:26:12

la table du dictionnaire de données DBA_SYNONYMS contient des informations sur tous les synonymes d'une base de données. Vous pouvez donc lancer 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 indique actuellement.

22
répondu Justin Cave 2008-10-29 15:11:30

la solution la moins intuitive à ce code d'erreur semble être des problèmes avec les objets que le synonyme pointe.

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';
11
répondu Jarrod Chesney 2015-08-01 08:34:59

Essayez cette sélection pour trouver la problématique des synonymes, il répertorie tous les synonymes qui sont pointant vers un objet qui n'existe pas (tables,vues,séquences,des paquets, des procédures, des 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
            )
        )
4
répondu Michal Mikolajczyk 2014-10-09 11:07:24

Aujourd'hui j'ai eu cette erreur, et après le débogage j'ai découvert que les tables étaient mal alignées, ce que je faisais référence en utilisant des synonymes. Donc je suggère - Vérifiez d'abord que si les tables existent!! :- ))

3
répondu Alan 2010-02-18 07:11:42

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

nous avons pu le corriger (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
répondu Tim Lewis 2017-05-23 12:02:50

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

1
répondu Jamie Kitson 2010-02-16 16:20:42

nous avions la même erreur ORA-01775 mais dans notre cas, l'utilisateur du schéma manquait un certain "select grant" sur quelques synonymes publics.

1
répondu Guy 2013-03-13 18:48:26

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

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

peut-être Existe-t-il un synonyme mais pas de tableau?


Étape 2) si ce n'est pas le problème, étudier le synonyme:

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

peut-être qu'il manque un tableau sous-jacent ou un point de vue sur ce synonyme?

1
répondu grokster 2014-08-07 16:20:01

ORA-01775: chaîne en boucle de synonymes J'ai affronté l'erreur ci-dessus alors que j'essayais de compiler un paquet qui utilisait un objet pour lequel synonym était créé mais l'objet sous-jacent n'était pas disponible.

0
répondu Nitin Guru 2011-07-21 12:27:40

Nous avons rencontré cette erreur aujourd'hui. C'est ainsi que nous débogué et fixe.

  1. Package est allé à l'état non valide en raison de cette erreur ORA-01775 .

  2. avec le numéro de ligne d'erreur , nous sommes passés par le code package et avons trouvé le code qui essayait d'insérer des données dans un table .

  3. table et synonym existe.

    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 ceci nous avons conclu que le tableau doit être recréé. Comme le synonym pointait vers un table qui n'existait pas.

  5. DBA équipe de re-création de la table et cela a réglé le problème.

0
répondu Mahi_0707 2016-03-18 20:59:53

j'utilise le sql suivant pour trouver des entrées dans all_synonyms où il n'y a pas d'objet correspondant pour l'object_name (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
répondu wmorrison365 2016-04-21 13:05:13

alors que la réponse de Jarrod est une bonne idée, et saisit un plus large éventail de problèmes connexes, j'ai trouvé cette requête trouvée dans les forums Oracle pour traiter plus directement la question (initialement déclaré):

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 invalides. Juste ceux qui sont en fait dans des boucles sans fin.

0
répondu Justin 2018-06-26 16:13:42

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

ORA-01775 : chaîne en boucle de synonymes

Cause : grâce à une série D'énoncés de synonymes, un synonyme a été défini qui se réfère à lui-même. Par exemple, les définitions suivantes sont circulaires:

CREATE SYNONYM s1 for s2 CREATE SYNONYM s2 for s3 CREATE SYNONYM s3 for s1

l'Action : Changer une synonyme définition qui s'applique à une table de base ou voir et rejouer l'opération.

-1
répondu warren 2008-10-29 15:12:51

si vous compilez une procédure, 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 procédure. Dans ce cas, la solution est de faire la requête déclarée comme chaîne de caractères eg v_query: = 'insert into table select * from table2 et ensuite exécuter immédiat sur v_query ;

C'est parce que le compilateur ne reconnaissent pas encore l'objet, et donc ne trouve pas la référence. Salutation.

-1
répondu Faxon 2015-03-04 18:23:52

j'avais une fonction définie dans le mauvais schéma et sans synonyme public. C'est-à-dire: mon proc était dans schema " Dogs "et la fonction était dans schema"Cats". La fonction n'avait pas de synonyme public pour permettre aux chiens d'accéder à la fonction des chats.

-1
répondu Nicholas V. 2017-01-31 13:52:06