Спасибо maovrn за отзыв. Приведенный материал достаточно объемный и дополнительные аспекты могут остаться незамеченными.
Вот смотрите: приведенное решение не нужно установить на серверах кроме одного DEV; dblink который создается использует соединение с базой от имени указанного пользователя и его права доступа; код без явного указания схемы, создается в схеме внешнего пользователя (в настройке dblink); скрипт сначала реально выполняется на DEV и тут никакой магии, а если нет ошибок дублируется на TST; все ходы записываются и им присваивается ревизия; пользователь upd изолирован, а доступ к dblink на прямую он не предоставляет.
Теперь, немного о правах доступа, вот пример (предположим что «test» будет вашей рабочей схемой на сервере TST):
SQL> connect system/***@TST
Connected.
SQL> create user test identified by ***;
User created.
SQL> grant dba to test;
Grant succeeded.
SQL> connect test/***@TST
Connected.
SQL> create database link back_dev connect to developer identified by *** using 'DEV';
Database link created.
SQL> select * from dual@back_dev;
D
-
X
SQL> connect upd/***@DEV
Connected.
create database link db_test connect to test identified by *** using 'TST';
Database link created.
--Разрешу developer используя алиас test_server попадать на сервер DEV к пользователю TEST
insert into upd$servers values ('test_server', 'db_test', 'developer', 'back_dev');
1 row inserted.
SQL> connect developer/***@DEV
Connected.
--я авторизован как developer и пакет будет создаваться в этой схеме
begin
upd.ChannelUpdate('test_server');
end;
--сначала в схеме developer успешно скомпилируется пакет
create or replace package test1 as
procedure proc1;
end;
/
begin
upd.ChannelPrepare;
--произойдет компиляция пакета на сервере TST для пользователя test, который имеет права DBA
upd.ChannelApply;
end;
ORA-01031: insufficient privileges
Почему это произошло? dblink не позволяет управлять привилегиями (т.е. выполнять grant, revoke) и разрешает только те права, которые пользователь имеет явно. Для выполнения этого обновления нужно выдать права: grant create procedure to test;
Указанные Вами опасения — не влияют на управляемость работой этого решения.
• В данном случае он только выполняет уже выполненный DDL.
• Как бы то ни было это мне больше всего и не нравится.
• Удаленный сервер должен иметь лишь один компонент — обратный dblink. Кстати можно обойтись и без dblink, но тогда размер блока обновления ограничен.
• Решение предназначено для использования (установки) на сервере разработки.
Этот вариант работал уже давно, но не так удобен. Чем система сложна? Пара таблиц, и триггер. Да, есть корявость с использованием джоба, но возможно это удастся скорректировать.
Если следовать вашим практическим советам по организации моделей данных, скажем инфраструктуры ЛВС, то как же их сочетать с теоретическими выдержками из этого комментария?
Я же указал в начале поста, о том, что привожу тестовый пример. В первом случае, выполнять этот подзапрос не имеет смысла, как впрочем, и во втором случае без него можно обойтись.
В таблицах отсутствует первичный ключ, триггер на его генерацию и создание сиквенса, не созданы индексы, и не даны рекомендации по наполнению тестовыми данными таблицы user_data. Используется пользователь SCOTT, явно из тестовый БД, которой на продуктивной, как правило, нет.
А что не так с commit? Создали таблицу, вставили данные, далее предполагается смена пользователя…
Уверен, что лишь специалист с глубоким опытом проектирования корпоративных систем, никогда не поскупится на создание лишних триггеров и представлений дублирующих имеющиеся таблицы. И конечно же, запросто перепишет те из них, которые перестанут удовлетворять требованиям ограничения доступа — сразу на продуктивной системе.
Не могу согласиться. В модели данных, для которой выполнялся поиск решения, действительно отсутствует специализированные средства, которые бы были разработаны для предоставления доступа к строкам на уровне пользователя. Но проблема заключалась не в этом. Перечень необходимых расширений в виде триггеров, констрейнов, таблиц – для актуализации журнала доступа или нагромождение представлениями, не казались приемлемыми решениями.
Есть возможность проверить?
Конкретные значения параметров указал на основании представленных в статье.
Вот смотрите: приведенное решение не нужно установить на серверах кроме одного DEV; dblink который создается использует соединение с базой от имени указанного пользователя и его права доступа; код без явного указания схемы, создается в схеме внешнего пользователя (в настройке dblink); скрипт сначала реально выполняется на DEV и тут никакой магии, а если нет ошибок дублируется на TST; все ходы записываются и им присваивается ревизия; пользователь upd изолирован, а доступ к dblink на прямую он не предоставляет.
Теперь, немного о правах доступа, вот пример (предположим что «test» будет вашей рабочей схемой на сервере TST):
Почему это произошло? dblink не позволяет управлять привилегиями (т.е. выполнять grant, revoke) и разрешает только те права, которые пользователь имеет явно. Для выполнения этого обновления нужно выдать права:
grant create procedure to test;
Указанные Вами опасения — не влияют на управляемость работой этого решения.
• Как бы то ни было это мне больше всего и не нравится.
• Удаленный сервер должен иметь лишь один компонент — обратный dblink. Кстати можно обойтись и без dblink, но тогда размер блока обновления ограничен.
• Решение предназначено для использования (установки) на сервере разработки.
Вы в этом уверены?
В таблицах отсутствует первичный ключ, триггер на его генерацию и создание сиквенса, не созданы индексы, и не даны рекомендации по наполнению тестовыми данными таблицы user_data. Используется пользователь SCOTT, явно из тестовый БД, которой на продуктивной, как правило, нет.
А что не так с commit? Создали таблицу, вставили данные, далее предполагается смена пользователя…