Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment rendre correctement un synonyme public

Je pense que Justin est sur la bonne voie. Ce que je pense que cela signifie en réalité, c'est que mydbowner.mytable n'existe pas.

Voici un exemple :

SQL> conn mbobak
Enter password: 
Connected.
SQL> drop table mytable;
drop table mytable
           *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL> create public synonym mytable for mbobak.mytable;

Synonym created.

SQL> select * from mytable;
select * from mytable
              *
ERROR at line 1:
ORA-01775: looping chain of synonyms

Je pense que ce qui se passe, c'est qu'Oracle essaie de résoudre mytable, il n'y a pas de mytable dans le schéma mbobak, donc il le recherche dans PUBLIC, il le trouve et voit qu'il pointe vers mbobak.mytable. Mais, mbobak.mytable n'existe pas, donc, il recherche mytable dans PUBLIC, et voilà la boucle.

Et en fait, si vous créez mytable, l'erreur disparaît :

SQL> create table mytable as select * from dual;

Table created.

SQL> select * from mytable;

D
-
X

1 row selected.

SQL> drop table mytable;

Table dropped.

SQL> select * from mytable;
select * from mytable
              *
ERROR at line 1:
ORA-01775: looping chain of synonyms

Oui, je me rends compte que cela n'a pas vraiment de sens, car, une fois le synonyme public résolu en mbobak.mytable, et qui n'est pas trouvé, il me semble qu'il devrait renvoyer une erreur ORA-942 "la table ou la vue n'existe pas ", ce qui me semble beaucoup plus logique.

Mais, cela semble être la façon dont cela fonctionne.

CQFD

J'espère que ça aide.