sql >> Databasteknik >  >> RDS >> Oracle

Hur man korrekt gör en offentlig synonym

Jag tror att Justin är på rätt väg. Vad jag tror att det faktiskt betyder är att mydbowner.mytable inte existerar.

Här är ett exempel:

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

Jag tror att det som händer är att Oracle försöker lösa mytable, det finns ingen mytable i mbobak-schemat, så det letar efter det i PUBLIC, det hittar det och ser att det pekar på mbobak.mytable. Men mbobak.mytable finns inte, så den letar efter mytable i PUBLIC, och där finns loopen.

Och faktiskt, om du skapar mytable, försvinner felet:

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

Ja, jag inser att det egentligen inte är helt vettigt, eftersom när den offentliga synonymen väl lösts till mbobak.mytable, och den inte hittas, verkar det som om den borde returnera ett fel ORA-942 "tabell eller vy finns inte ", vilket är mycket mer meningsfullt för mig.

Men det verkar vara så här det fungerar.

QED

Hoppas det hjälper.



  1. ordning efter en parameter

  2. markör:stift S vänta på X

  3. Hur man använder SQL Server HierarchyID genom enkla exempel

  4. Överträdelse av begränsningar när en till många-relation består