Управление Синонимами 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