Как правильно сделать публичный синоним - PullRequest
10 голосов
/ 25 января 2012

Это довольно глупо, но мне нужна помощь.

У меня есть стол, принадлежащий mydbowner. Он называется mydbowner.mytable. Я попытался сделать общедоступный синоним, введя команду:

СОЗДАНИЕ ИЛИ ЗАМЕНА ПУБЛИЧНОГО СИНонимА mytable FOR mydbowner.mytable;

Когда я делаю это и запрашиваю таблицу, я получаю:

ORA-01775: циклическая цепочка синонимов

Как сделать этот синоним без проблем.

Ответы [ 2 ]

14 голосов
/ 25 января 2012

Я думаю, что Джастин на правильном пути. Я думаю, что на самом деле это означает, что mydbowner.mytable не существует.

Вот пример:

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

Я думаю, что происходит то, что Oracle пытается разрешить mytable, в схеме mbobak mytable отсутствует, поэтому он ищет ее в PUBLIC, находит и видит, что указывает на mbobak.mytable. Но mbobak.mytable не существует, поэтому он ищет mytable в PUBLIC, и есть цикл.

А на самом деле, если вы создаете mytable, ошибка исчезает:

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

Да, я понимаю, что это на самом деле не совсем имеет смысла, так как, как только общедоступный синоним разрешается в mbobak.mytable, и он не найден, как мне кажется, он должен возвращать таблицу или представление ошибки ORA-942 " не существует ", что имеет для меня гораздо больше смысла.

Но, похоже, так оно и есть.

QED

Надеюсь, это поможет.

7 голосов
/ 25 января 2012

Ошибка, которую вы получаете, подразумевает, что mydbowner.mytable на самом деле не является таблицей. Что значит

SELECT object_type
  FROM all_objects
 WHERE owner = 'MYDBOWNER'
   AND object_name = 'MYTABLE'

вернуться? * * 1005

...