Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como fazer corretamente um sinônimo público


Acho que Justin está no caminho certo. O que eu acho que realmente significa é que mydbowner.mytable não existe.

Aqui está um exemplo:
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

Acho que o que está acontecendo é que o Oracle tenta resolver mytable, não existe mytable no esquema mbobak, então ele procura em PUBLIC, encontra e vê que aponta para mbobak.mytable. Mas, mbobak.mytable não existe, então, ele procura por mytable em PUBLIC, e aí está o loop.

E, de fato, se você criar mytable, o erro desaparece:
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

Sim, eu percebo que realmente não faz muito sentido, pois, uma vez que o sinônimo público resolvido para mbobak.mytable, e isso não for encontrado, parece-me, ele deve retornar um erro ORA-942 "tabela ou visualização não existe ", o que faz muito mais sentido para mim.

Mas, parece que é assim que funciona.

QED

Espero que ajude.