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

Je suis familier avec le problème derrière ORA-01775: 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 ma solution?

Y a-t-il un moyen d’interroger le schéma ou autre 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.

En fait, le problème n’était pas une chaîne de synonymes en boucle, mais le fait que le synonyme indiquait une vue qui n’existait pas.

Oracle semble être une chaîne en boucle dans cette condition.

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

La table de dictionnaire de données DBA_SYNONYMS contient des informations sur tous les synonymes d’une firebase database. Donc, vous pouvez exécuter la requête

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

pour voir à quoi le synonyme public pointe actuellement.

La solution moins intuitive à ce code d’erreur semble être les problèmes avec les objects sur lesquels le synonyme pointe.

Voici mon SQL pour trouver des synonymes qui pointent vers des objects 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 rechercher les synonymes problématiques, elle répertorie tous les synonymes qui pointent vers un object 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 ) ) 

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

Un développeur a accidentellement écrit le code qui a généré et exécuté l’instruction SQL suivante CREATE OR REPLACE PUBLIC SYNONYM "DUAL" FOR "DUAL"; qui a provoqué select * from dba_synonyms where table_name = 'DUAL'; pour renvoyer 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; 

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 du schéma.

Nous avions la même erreur ORA-01775, mais dans notre cas, l’utilisateur du schéma manquait de «sélection de subvention» sur quelques synonymes publics.

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

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

Il se pourrait qu’un synonyme existe mais pas de tableau?


É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’un tableau ou une vue sous-jacente à ce synonyme manque?

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

Nous avons rencontré cette erreur aujourd’hui. Voici comment nous avons débogué et corrigé le problème.

  1. Le package est devenu invalide en raison de cette erreur ORA-01775 .

  2. Avec le numéro de ligne d’erreur, nous avons parcouru le code du corps du package et 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 le table et le synonym ci table dessus existent.

     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 indiquait une table qui n’existait pas.

  5. L’équipe DBA a recréé la table et le problème a été résolu.

J’utilise le sql suivant pour trouver des entrées dans all_synonymes où il n’y a pas d’object correspondant pour le nom_object (dans les objects_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 qu’elle couvre un large éventail de problèmes connexes, cette requête a été trouvée dans les forums Oracle pour aborder plus directement le problème (initialement mentionné):

 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’objects non valides. Juste ceux qui sont en réalité dans des boucles sans fin.

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

ORA-01775 : chaîne en boucle de synonymes
Cause : Grâce à une série d’instructions de synonymes CREATE, un synonyme a été défini. Par exemple, les définitions suivantes sont circulaires:
CREATE SYNONYM s1 for s2 CREATE SYNONYM s2 for s3 CREATE SYNONYM s3 for s1
Action : Modifiez une définition de synonyme pour qu’elle s’applique à une table ou à une vue de base, puis relancez l’opération.

Si vous comstackz une PROCEDURE, cela fait peut-être référence à une table ou à une vue qui n’existe pas telle qu’elle est créée dans la même PROCEDURE. Dans ce cas, la solution consiste à rendre la requête déclarée en tant que chaîne, par exemple v_query: = 'insert into table select * from table2 et ensuite exécuter immédiatement sur v_query ;

En effet, le compilateur ne reconnaît pas encore l’object 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 que ma proc était dans le schéma “Dogs” et que la fonction était dans le schéma “Cats”. La fonction n’avait pas de synonyme public pour permettre aux chiens d’accéder à la fonction des chats.