Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 DB-LINK на другую схему в ту же базу - плохо?  [new]
shurka22
Member

Откуда:
Сообщений: 74
Коллеги, привет.

Кратко: насколько потенциально опасно делать DB-LINK на другую схему в ту же базу?
Грант не помогает :(

Детально:
Находимся в схеме-1 (C1). Есть вторая схема (C2), где надо вызвать функцию F (сторонний вендор, куча кода). Эта функция использует вызов функции sys_context(). Контекст же устанавливается триггером на LOGON.
Если коннектимся на схему S2: триггер отрабатывает, у функции один результат.
Если коннектимся на схему S1: права вызова через грант, триггер не отрабатывает, у функции другой результат.
Получается запустить, если сделать DB-LINK в пределах одной базы со схемы-1 на схему-2.
Насколько это опасно? Ну вдруг оракл не рекомендует такой финт. Вроде бы тесты работают.

Ну или вдруг подскажете решение проще?
Спасибо.
4 дек 18, 08:53    [21752576]     Ответить | Цитировать Сообщить модератору
 Re: DB-LINK на другую схему в ту же базу - плохо?  [new]
shurka22
Member

Откуда:
Сообщений: 74
shurka22,
Сам себе отвечу: есть решение без ДБ-линка, если на схеме-1 повторить логику триггера схемы-2 ON LOGON. Надо разбираться в логике этого кода, он местами завязан на USER. В общем затея возможная, но не самая простая.
4 дек 18, 09:08    [21752588]     Ответить | Цитировать Сообщить модератору
 Re: DB-LINK на другую схему в ту же базу - плохо?  [new]
A K
Member

Откуда:
Сообщений: 352
dblink в той же бд, разумно использовать если у вас схемы могут мигрировать между базами (их могут перемещать в другие бд в зависимости от разных условий), еще очень удобно, если используется стендбай для балансировки нагрузки при распределении запросов (что бы из праймари обратиться запросом к стендбаю и наоборот), но в вашем случае, насколько я правильно вас понял, нужно создавать хранимки с invoker_rights_clause. Тогда они будут себя вести по-разному в зависимости от того, кто их вызывает. Почитайте Тома Кайта! Он очень хорошо описывает эти хранимки.
4 дек 18, 12:52    [21752804]     Ответить | Цитировать Сообщить модератору
 Re: DB-LINK на другую схему в ту же базу - плохо?  [new]
shurka22
Member

Откуда:
Сообщений: 74
A K
но в вашем случае, насколько я правильно вас понял, нужно создавать хранимки с invoker_rights_clause.

Вы про authid current_user? Кажется, что мне это не поможет.

У меня случай такой: процедура в схеме-2 отрабатывает корректно при следующих условиях:
1) сработал триггер ON LOGON, который устанавливает переменные контекста
2) запрос "SELECT USER FROM DUAL" - возвращает значение "схема-2". На это завязана как минимум раздача неких прикладных прав.

При вызове через DB-link оба условия выполняются.

При вызове через гранты:
1) триггер мы можем щёлкнуть вручную
2) но подменить USER - мне представляется проблематичным. Или как-то можно?
5 дек 18, 06:44    [21753887]     Ответить | Цитировать Сообщить модератору
 Re: DB-LINK на другую схему в ту же базу - плохо?  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28480
shurka22
Или как-то можно?
Согласовать со "сторонним вендором" не хакерский, а легальный способ взаимодействия - не судьба?
5 дек 18, 08:42    [21753920]     Ответить | Цитировать Сообщить модератору
 Re: DB-LINK на другую схему в ту же базу - плохо?  [new]
shurka22
Member

Откуда:
Сообщений: 74
Elic
Согласовать со "сторонним вендором" не хакерский, а легальный способ взаимодействия - не судьба?

Видимо да, не судьба.
Руководство настаивает на анализе кода стороннего вендора, и написании аналога кода, чтобы делать то же самое, но со схемы-1.
Аргументы: нецелевое использование ДБ-линка. Используем не так, как задумал оракл. Уж лучше вообще отказаться от решения задачи, чем через такой дб-линк. Петлю из двух дб-линков (на вторую базу, и потом назад) - тоже отвергли.
Сейчас задача решена через джоб: на схеме-1 создаём задание для джоба. На схеме-2 время от времени запускается джоб, который исполняет это задание. Криво, долго, не синхронно, но работает.
5 дек 18, 08:56    [21753928]     Ответить | Цитировать Сообщить модератору
 Re: DB-LINK на другую схему в ту же базу - плохо?  [new]
shurka22
Member

Откуда:
Сообщений: 74
я бы переформулировал задачу так:

Как из схемы-1 (user-1) вызвать процедуру П() на схеме-2 (user-2), чтобы эта процедура выполнилась, как будто мы зашли в оракл и выполнили её от имени user-2?

А именно:
1) щёлкнулись все триггеры, которые щёлкаются при логине user-2. Это ON LOGON, может быть что-то ещё есть.
2) "select user from dual" говорил бы именно user-2, а не user-1 (user-1 он скажет, если мы просто дадим грант, и позовём из схемы-1).
3) что-то ещё?
5 дек 18, 09:10    [21753932]     Ответить | Цитировать Сообщить модератору
 Re: DB-LINK на другую схему в ту же базу - плохо?  [new]
Viewer
Member

Откуда: Самара
Сообщений: 5230
https://oracle-base.com/articles/misc/proxy-users-and-connect-through#proxy-user-and-connect-through
?
5 дек 18, 09:13    [21753939]     Ответить | Цитировать Сообщить модератору
 Re: DB-LINK на другую схему в ту же базу - плохо?  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28480
shurka22
Используем не так, как задумал оракл.
Не так, как задумал вендор. Голь на выдумки хитра?
5 дек 18, 09:20    [21753943]     Ответить | Цитировать Сообщить модератору
 Re: DB-LINK на другую схему в ту же базу - плохо?  [new]
shurka22
Member

Откуда:
Сообщений: 74
Viewer
https://oracle-base.com/articles/misc/proxy-users-and-connect-through#proxy-user-and-connect-through
?

Как я понимаю, вы предлагаете user-1 сделать прокси-пользователем для user-2. Так? То есть залить все объекты схемы-1 в схему-2.
Это можно сделать и без прокси-пользователя. Но крайне нежелательно, а скорее - невозможно. Обе схемы очень большие, старые, давно работают.
5 дек 18, 09:22    [21753948]     Ответить | Цитировать Сообщить модератору
 Re: DB-LINK на другую схему в ту же базу - плохо?  [new]
shurka22
Member

Откуда:
Сообщений: 74
Elic
Не так, как задумал вендор. Голь на выдумки хитра?

Ну вдруг есть более изящное решение? ДБ-линк на ту же БД - он мне и самому не сильно нравится. Просто я не вижу решения дешевле.
5 дек 18, 09:25    [21753951]     Ответить | Цитировать Сообщить модератору
 Re: DB-LINK на другую схему в ту же базу - плохо?  [new]
Viewer
Member

Откуда: Самара
Сообщений: 5230
shurka22
Как я понимаю, вы предлагаете ... залить все объекты схемы-1 в схему-2

Это ваши домыслы...
Вы же хотели:
shurka22
1) щёлкнулись все триггеры, которые щёлкаются при логине user-2
2) "select user from dual" говорил бы именно user-2, а не user-1
5 дек 18, 09:38    [21753958]     Ответить | Цитировать Сообщить модератору
 Re: DB-LINK на другую схему в ту же базу - плохо?  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1415
shurka22,

общаться между сессиями (user1/user2) можно через dbms_pipe

user2 логинется как технический (c onlogon-ом, контекстом і тд) и ждет указания какую процедуру/ф-цию вызвать

....
stax
5 дек 18, 09:56    [21753971]     Ответить | Цитировать Сообщить модератору
 Re: DB-LINK на другую схему в ту же базу - плохо?  [new]
shurka22
Member

Откуда:
Сообщений: 74
Viewer
shurka22
Как я понимаю, вы предлагаете ... залить все объекты схемы-1 в схему-2

Это ваши домыслы...
Вы же хотели:
shurka22
1) щёлкнулись все триггеры, которые щёлкаются при логине user-2
2) "select user from dual" говорил бы именно user-2, а не user-1

Всё верно. Видимо я вас не понял.

Давайте по шагам:
Схема-1/user-1, схема-2/user-2 - остаются без изменений.
Создаём user-3, который прокси-пользователь для user-2.
То есть логинимся как user-3, но получаем все права, как user-2.
Как я понимаю, схемой для user-3 будет схема-2. Да пусть даже и схема-3 - это не важно.

А дальше-то что?

Когда я из под пользователя user-1 пойду вызывать процедуру схема2.П() (по любой цепочке, через схему-3, или напрямую), то "select user from dual" у меня всё равно будет user-1, а не user-2. То есть процедура П() отработает неверно.
5 дек 18, 09:58    [21753976]     Ответить | Цитировать Сообщить модератору
 Re: DB-LINK на другую схему в ту же базу - плохо?  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28480
shurka22
Elic
Не так, как задумал вендор. Голь на выдумки хитра?
Ну вдруг есть более изящное решение?
Ещё раз. Не "ломайте" вендора. Лучше договоритесь с ним.
5 дек 18, 10:00    [21753978]     Ответить | Цитировать Сообщить модератору
 Re: DB-LINK на другую схему в ту же базу - плохо?  [new]
shurka22
Member

Откуда:
Сообщений: 74
Stax
shurka22,
общаться между сессиями (user1/user2) можно через dbms_pipe

Тут сразу гроздь проблем:
1) пайп - достаточно капризный механизм, это не дб-линк. для чтения пайпы, надо сразу на схеме-2 поднять какой-то джоб или процесс, который будет непрерывно его слушать. любой джоб или процесс - головная боль для админов, надо следить, чтобы не упал. Вовремя опускать/поднимать.
2) нужно не только вызвать функцию, но и узнать результат. В случае процедуры - понять, что процедура не сломалась. Как это сделать через пайп - я не знаю. Ну то есть сделать-то можно, но это ещё более криво, чем всё остальное.
5 дек 18, 10:05    [21753982]     Ответить | Цитировать Сообщить модератору
 Re: DB-LINK на другую схему в ту же базу - плохо?  [new]
shurka22
Member

Откуда:
Сообщений: 74
Elic
Ещё раз. Не "ломайте" вендора. Лучше договоритесь с ним.

Вендор уже "поломан" :)
Часть логики вендора уже переписана (до меня).
Видимо, придётся и тут грызть гранит.
5 дек 18, 10:08    [21753986]     Ответить | Цитировать Сообщить модератору
 Re: DB-LINK на другую схему в ту же базу - плохо?  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28480
shurka22
Часть логики вендора уже переписана (до меня).
Таки голь.
5 дек 18, 10:10    [21753988]     Ответить | Цитировать Сообщить модератору
 Re: DB-LINK на другую схему в ту же базу - плохо?  [new]
Viewer
Member

Откуда: Самара
Сообщений: 5230
shurka22
Давайте по шагам:
Схема-1/user-1, схема-2/user-2 - остаются без изменений.
Создаём user-3, который прокси-пользователь для user-2.
То есть логинимся как user-3, но получаем все права, как user-2.

SQL> alter user USER1  grant connect through USER2;

User altered.

SQL> connect USER1[USER2]
Enter password:
   <пароль_user1>
Connected.

SQL> show user
USER is "USER2" 
5 дек 18, 10:11    [21753991]     Ответить | Цитировать Сообщить модератору
 Re: DB-LINK на другую схему в ту же базу - плохо?  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1415
shurka22,

с помощью джоба как узнаете результат?

pipe не панацея, а как один из вариантов
user1 может через pipe общатся с user2,
не только просить запуск процедуры но и как дела, чем занят, настроение и тд

.....
stax
5 дек 18, 10:20    [21754003]     Ответить | Цитировать Сообщить модератору
 Re: DB-LINK на другую схему в ту же базу - плохо?  [new]
shurka22
Member

Откуда:
Сообщений: 74
Stax
shurka22,
с помощью джоба как узнаете результат?

Как узнаЁм сейчас?
Никак не узнаём - в этом-то и беда, асинхрон у нас. Ну то есть узнаём, но позже. Это и есть главная проблема.

Очень хочется сделать так, чтобы когда схема-1 захотела позвать схема2.П(), она сразу бы (в синхронном режиме) получила результат работы.

Stax
pipe не панацея, а как один из вариантов
user1 может через pipe общатся с user2,
не только просить запуск процедуры но и как дела, чем занят, настроение и тд

Спросить-то можно, ответ в синхронном режиме никак не получить.
5 дек 18, 10:48    [21754019]     Ответить | Цитировать Сообщить модератору
 Re: DB-LINK на другую схему в ту же базу - плохо?  [new]
shurka22
Member

Откуда:
Сообщений: 74
Viewer
SQL> alter user USER1  grant connect through USER2;

User altered.

SQL> connect USER1[USER2]
Enter password:
   <пароль_user1>
Connected.

SQL> show user
USER is "USER2" 

Спасибо, теперь понял. Видимо всё равно не годится.
Мы не просто вызываем функцию схема2.П() из схемы-1, а из процедур/функций схемы-1. Все обработчики коннектятся на схему-1 и работают с объектами схемы-1. И вот одна из функций схемы-1 (пусть схема1.Ф1()) хочет вызвать процедуру схема2.П(), причём вызвать так, как будто бы схема2.П() исполнялась бы из под пользователя user2. Вызвать, и сразу (в синхронном режиме) получить результат работы - от ответа будет зависеть дальнейшая логика функции схема1.Ф1().
5 дек 18, 10:54    [21754024]     Ответить | Цитировать Сообщить модератору
 Re: DB-LINK на другую схему в ту же базу - плохо?  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1415
shurka22
Спросить-то можно, ответ в синхронном режиме никак не получить.

я наверное чего-то не понимаю

разработать протокол диалога user1 i user2

грубо
логинется user2 и ждет
1 по пайпу спашивает 2 как дела, готов ли ты к работе
если 2 готов, 1 дает ему задание и переходит в режим ожидания
2 выполнил процедуру и расказывает 1 как все прошло
1 благодарит за оказанную услугу и занимается своим делом
2 переходит в режим ожидания

.....
stax
5 дек 18, 10:59    [21754027]     Ответить | Цитировать Сообщить модератору
 Re: DB-LINK на другую схему в ту же базу - плохо?  [new]
shurka22
Member

Откуда:
Сообщений: 74
Stax
разработать протокол диалога user1 i user2

Всё так.
Сейчас всю эту задачу может решить ДБ-линк. Получится куда как проще, дешевле и надёжнее. И время отклика будет на порядки быстрее.
Я и спросил: нет ли более изящного решения, чем ДБ-линк?
5 дек 18, 11:17    [21754046]     Ответить | Цитировать Сообщить модератору
 Re: DB-LINK на другую схему в ту же базу - плохо?  [new]
BTM
Member

Откуда:
Сообщений: 117
shurka22,

Это нормальное решение, называется loopback db_link, довольно распространенное,
и Том Кайт одобряет
автор
It is useful for connecting as another user in your current session (eg: the loopback link can connect as scott/tiger whilst you are logged in as bob)

, и вашу задачу решает. Не умножайте сущности.
5 дек 18, 12:21    [21754155]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить