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.
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.
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.
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 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 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
)
)
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! :-))
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;
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.
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.
É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?
Nous avons rencontré cette erreur aujourd'hui. Voici comment nous l'avons corrigé et corrigé.
Le paquet est devenu invalide en raison de l'erreur ORA-01775
.
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
.
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
Avec cela, nous avons conclu que la table doit être recréée. Comme le synonym
désignait un table
qui n’existait pas.
L'équipe DBA a recréé la table, ce qui a résolu le problème.
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.
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'
)
);
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.