Управление синонимами Oracle - PullRequest
7 голосов
/ 13 июля 2011

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

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

  1. Сначала к локальным объектам всегда обращаются.

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

  3. Если закрытый синоним не существует или объект не существует, то будет использоваться публичный синоним.

Мне было интересно, отсутствуют ли публичные объекты в этом порядке?

например. если пользователь BOB запрашивает

select * from FOOBAR

и в dba_tables / views нет BOB.FOOBAR, кроме PUBLIC.FOOBAR.

Oracle разрешает его в PUBLIC.FOOBAR или сначала проверяет синонимы?

Спасибо.

Ответы [ 2 ]

10 голосов
/ 13 июля 2011

В вашем примере 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
3 голосов
/ 13 июля 2011

По крайней мере, до 10 г, 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');

Вы можете ответить на вопрос о предопределенных таблицах / представлениях в PUBLIC"схема".

...