Управление Синонимами Oracle
Я читал эту статью: Управление Синонимами Oracle
Что касается порядка предпочтений, когда дело доходит до разрешения имени объекта на фактический объект, он говорит:
- сначала всегда будут доступны локальные объекты. 
- если локальный объект не существует, будет доступен объект с частным синонимом. 
- если частный синоним не существует или объект не exist, тогда будет использоваться публичный синоним. 
мне было интересно, если общественные объекты отсутствуют в этом порядке как-то?
Е. Г. если пользователь Bob запросов
select * from FOOBAR
и нет Боба.FOOBAR в dba_tables / views, но общедоступный.ФУБАР.
разрешает ли Oracle его для публики.FOOBAR или он сначала проверит синонимы?
спасибо.
2 ответов
по крайней мере до 10g, PUBLIC не является реальным пользователем. Нельзя создавать объекты в "общедоступной схеме":
SQL> CREATE TABLE public.foobar (id integer);
CREATE TABLE public.foobar (id integer)
ORA-00903: invalid table name
SQL> CREATE TABLE system.foobar (id integer);
Table created
SQL> 
Если вы запустите этот запрос:
SELECT object_name 
  FROM dba_objects 
 WHERE owner='PUBLIC' 
   AND object_type IN ('TABLE', 'VIEW');
вы можете ответить на вопрос о предопределенных таблицах/представлениях в общедоступной "схеме".
в вашем примере FOOBAR почти наверняка является публичным синонимом.  Нет PUBLIC схемы, но PUBLIC указан как владелец публичного синонима.
если я создам новый публичный синоним
SQL> create public synonym pub_syn_emp
  2     for scott.emp;
Synonym created.
владелец этого синонима в конечном итогеPUBLIC 
SQL> ed
Wrote file afiedt.buf
  1  select object_name, owner, object_type
  2    from dba_objects
  3*  where object_name = 'PUB_SYN_EMP'
SQL> /
OBJECT_NAME          OWNER      OBJECT_TYP
-------------------- ---------- ----------
PUB_SYN_EMP          PUBLIC     SYNONYM
кроме того, пункт #3 не представляется правильным. Если существует закрытый синоним, указывающий на несуществующий объект, и открытый синоним, указывающий на допустимый объект, частный синоним по-прежнему имеет приоритет. Вы просто получите сообщение об ошибке, когда Oracle попытается разрешить частный синоним к фактическому объекту.
SQL> create synonym syn_emp for scott.no_such_table;
Synonym created.
SQL> create public synonym syn_emp for scott.emp;
Synonym created.
SQL> select * from syn_emp;
select * from syn_emp
              *
ERROR at line 1:
ORA-00980: synonym translation is no longer valid
