Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 dblink + current_schema = ?  [new]
pravednik
Member

Откуда: Львов
Сообщений: 16286
Всем привет.
Пытаюсь понять следующий кейс.
Oracle 18c.

Есть private dblink_х в схеме А смотрящий на Host_1
Есть private dblink_х в схеме B смотрящий на Host_1
Есть public dblink_х смотрящий на Host_2.

 -- connect A

SQL>  select host_name from v$instance@dblink_х;

HOST_NAME
----------------------------------------------------------------
Host_1

SQL>  alter session set current_schema=B;

Session altered.

SQL> select host_name from v$instance@dblink_х;

HOST_NAME
----------------------------------------------------------------
Host_2


Я предполагал, что или получу ошибку или все равно заюзаю приватный линк юзера А.
Но не результат от паблик линка.
10 июн 19, 11:16    [21905773]     Ответить | Цитировать Сообщить модератору
 Re: dblink + current_schema = ?  [new]
Vivat!San
Member

Откуда: Отсюда не возвращаются
Сообщений: 570
Ты ему сказал - теперь ищи db_link_x в пространстве имён схемы B,
а если не найдёшь сходи посмотри нет ли такого в PUBLIC, он так и отработал.
10 июн 19, 11:24    [21905784]     Ответить | Цитировать Сообщить модератору
 Re: dblink + current_schema = ?  [new]
Vivat!San
Member

Откуда: Отсюда не возвращаются
Сообщений: 570
pravednik,

для USER A в схеме B нет dblink_X, есть только в PUBLIC,
он туда и пошёл ну и собственно нет повода для ошибки.
10 июн 19, 11:30    [21905791]     Ответить | Цитировать Сообщить модератору
 Re: dblink + current_schema = ?  [new]
pravednik
Member

Откуда: Львов
Сообщений: 16286
Vivat!San
Ты ему сказал - теперь ищи db_link_x в пространстве имён схемы B,
а если не найдёшь сходи посмотри нет ли такого в PUBLIC, он так и отработал.


current_schema применяется для всех объектов без "квалификатора".
"In subsequent SQL statements, Oracle Database uses this schema name as the schema qualifier when the qualifier is omitted."
дблинк есть в данном случае квалификатор таблицы, поэтому вроде как current_schema не должно влиять на него.
10 июн 19, 13:57    [21905920]     Ответить | Цитировать Сообщить модератору
 Re: dblink + current_schema = ?  [new]
Vivat!San
Member

Откуда: Отсюда не возвращаются
Сообщений: 570
pravednik

current_schema применяется для всех объектов без "квалификатора".
"In subsequent SQL statements, Oracle Database uses this schema name as the schema qualifier when the qualifier is omitted."
дблинк есть в данном случае квалификатор таблицы, поэтому вроде как current_schema не должно влиять на него.


Его нет, так как он приватный, он невидим из другой схемы.
10 июн 19, 14:06    [21905932]     Ответить | Цитировать Сообщить модератору
 Re: dblink + current_schema = ?  [new]
pravednik
Member

Откуда: Львов
Сообщений: 16286
Vivat!San
pravednik
current_schema применяется для всех объектов без "квалификатора".
"In subsequent SQL statements, Oracle Database uses this schema name as the schema qualifier when the qualifier is omitted."
дблинк есть в данном случае квалификатор таблицы, поэтому вроде как current_schema не должно влиять на него.


Его нет, так как он приватный, он невидим из другой схемы.

Я к тому, что current_schema не должна апплаится к таблице с дблинком, потому как она имеет квалификатор.
10 июн 19, 18:17    [21906131]     Ответить | Цитировать Сообщить модератору
 Re: dblink + current_schema = ?  [new]
Vivat!San
Member

Откуда: Отсюда не возвращаются
Сообщений: 570
pravednik
Я к тому, что current_schema не должна апплаится к таблице с дблинком, потому как она имеет квалификатор.


нет, для этого нужно явно указать схему, указание db_link не заменяет квалификатор схемы.
10 июн 19, 18:37    [21906144]     Ответить | Цитировать Сообщить модератору
 Re: dblink + current_schema = ?  [new]
х.з.
Member

Откуда:
Сообщений: 718
Vivat!San
так как он приватный

аргумент так себе. таблица тоже приватна, но она же видна из другой схемы при наличии грантов.
11 июн 19, 01:26    [21906285]     Ответить | Цитировать Сообщить модератору
 Re: dblink + current_schema = ?  [new]
х.з.
Member

Откуда:
Сообщений: 718
pravednik
дблинк есть в данном случае квалификатор таблицы, поэтому вроде как current_schema не должно влиять на него.

еще из-за безопасности вроде как такое поведение.
11 июн 19, 01:36    [21906286]     Ответить | Цитировать Сообщить модератору
 Re: dblink + current_schema = ?  [new]
-2-
Member

Откуда:
Сообщений: 14650
х.з.
Vivat!San
так как он приватный
аргумент так себе. таблица тоже приватна, но она же видна из другой схемы при наличии грантов.
Таблица, конечно, тоже может быть создана как public, но это не повод для отождествления понятия приватности. К дблинку не предусмотрено квалификатора схемы и его в принципе нельзя адресовать в другой схеме ни в запросах, ни в ddl.
11 июн 19, 06:44    [21906309]     Ответить | Цитировать Сообщить модератору
 Re: dblink + current_schema = ?  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18079
pravednik
Vivat!San
пропущено...


Его нет, так как он приватный, он невидим из другой схемы.

Я к тому, что current_schema не должна апплаится к таблице с дблинком, потому как она имеет квалификатор.
db_link является квалификатором таблицы, поэтому к ее имени не надо добавлять "B." -- это верно
Но само описание db_link уже не будет искаться в схеме A, а из схемы B оно недоступно (по соображениям секурности в первую очередь, но и не надо забывать что по синтаксису "." вполне себе разрешена в имени db_link, поэтому добавление "B." к имени db_link-а это точно не то, что надо)
Но зато вполне себе доступно описание PUBLIC DB_LINK с таким же именем, почему бы его не использовать.

PS. Можно обернуть вызов в функцию (AUTHID DEFINER)
11 июн 19, 06:54    [21906312]     Ответить | Цитировать Сообщить модератору
 Re: dblink + current_schema = ?  [new]
pravednik
Member

Откуда: Львов
Сообщений: 16286
Вячеслав Любомудров
pravednik
пропущено...

Я к тому, что current_schema не должна апплаится к таблице с дблинком, потому как она имеет квалификатор.
db_link является квалификатором таблицы, поэтому к ее имени не надо добавлять "B." -- это верно
Но само описание db_link уже не будет искаться в схеме A, а из схемы B оно недоступно (по соображениям секурности в первую очередь, но и не надо забывать что по синтаксису "." вполне себе разрешена в имени db_link, поэтому добавление "B." к имени db_link-а это точно не то, что надо)
Но зато вполне себе доступно описание PUBLIC DB_LINK с таким же именем, почему бы его не использовать.

PS. Можно обернуть вызов в функцию (AUTHID DEFINER)

Ок.

автор
Но само описание db_link уже не будет искаться в схеме A

Вот это меня как раз и "беспокоит".

Если дб_линк является квалификатором объекта, то "полное" имя этого не должно меняться(так как оно уже и так полное).
Ну то есть, при
--conn A
alter session set current_schema=B;
select * from A.TABLE_NAME;
select * from TABLE_NAME;

я получу данные из таблицы A.TABLE_NAME и из TABLE_NAME при наличии грантов.
Я понимаю, что с дблинком есть нюанс с точки зрения секурности, поэтому и ожидаю что для дблинка
"alter session set current_schema=B;" будет или проигнорировано или я получу
ORA-02019: connection description for remote database not found
11 июн 19, 10:16    [21906404]     Ответить | Цитировать Сообщить модератору
 Re: dblink + current_schema = ?  [new]
проходил мимо...
Member

Откуда: от верблюда
Сообщений: 1075
pravednik,

Doc ID 793693.1
CAUSE
Bug 4416663 DATABASE LINK FAILS WITH ORA-2019 WHEN CURRENT_SCHEMA SET TO ANOTHER USER
Closed as this is an expected behaviour
11 июн 19, 18:03    [21906968]     Ответить | Цитировать Сообщить модератору
 Re: dblink + current_schema = ?  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18079
pravednik
Если дб_линк является квалификатором объекта, то "полное" имя этого не должно меняться(так как оно уже и так полное).
Ну то есть, при
--conn A
alter session set current_schema=B;
select * from A.TABLE_NAME;
select * from TABLE_NAME;

я получу данные из таблицы A.TABLE_NAME и из TABLE_NAME при наличии грантов.
Я понимаю, что с дблинком есть нюанс с точки зрения секурности, поэтому и ожидаю что для дблинка
"alter session set current_schema=B;" будет или проигнорировано или я получу
ORA-02019: connection description for remote database not found
Причем либо объектных, а если их нет, то с помощью системных
С линком похоже -- описания частного уже не видно, но публичный доступен. Убери его и получишь ожидаемую ORA-02019
12 июн 19, 05:18    [21907142]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить