sql >> Base de Datos >  >> RDS >> Oracle

Cómo hacer correctamente un sinónimo público

Creo que Justin está en el camino correcto. Lo que creo que significa en realidad es que mydbowner.mytable no existe.

He aquí un ejemplo:

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

Creo que lo que sucede es que Oracle intenta resolver mytable, no hay mytable en el esquema de mbobak, entonces lo busca en PUBLIC, lo encuentra y ve que apunta a mbobak.mytable. Pero, mbobak.mytable no existe, entonces, busca mytable en PUBLIC, y ahí está el bucle.

Y de hecho, si crea mytable, el error 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

Sí, me doy cuenta de que en realidad no tiene mucho sentido, ya que, una vez que el sinónimo público se resolvió en mbobak.mytable, y no se encuentra, me parece que debería devolver un error ORA-942 "la tabla o la vista no existe ", lo que tiene mucho más sentido para mí.

Pero parece que así es como funciona.

QED

Espero que ayude.