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.
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.
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
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.
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';
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
)
)
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!! :- ))
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;
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.
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.
É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?
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.
Nous avons rencontré cette erreur aujourd'hui. C'est ainsi que nous débogué et fixe.
-
Package est allé à l'état non valide en raison de cette erreur
ORA-01775
. -
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 untable
. -
table
etsynonym
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
-
avec ceci nous avons conclu que le tableau doit être recréé. Comme le
synonym
pointait vers untable
qui n'existait pas. -
DBA équipe de re-création de la table et cela a réglé le problème.
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'
)
);
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.
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.
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.
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.