Управление Синонимами Oracle

Я читал эту статью: Управление Синонимами Oracle

Что касается порядка предпочтений, когда дело доходит до разрешения имени объекта на фактический объект, он говорит:

  1. сначала всегда будут доступны локальные объекты.

  2. если локальный объект не существует, будет доступен объект с частным синонимом.

  3. если частный синоним не существует или объект не 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