Я пытаюсь реализовать защиту базы данных, как описано в Oracle Database Security Guide, и мой сценарий выглядит следующим образом:
- user OWNER создать таблицу TABLE_A;
user OWNERсоздайте пакет бизнес-логики обертывания PKG_A для TABLE_A следующим образом:
package body PKG_A AS
procedure doSomeManagerStuff (pRow TABLE_A%rowtype) as
begin
...
end;
procedure doSomeDataEntryStuff (pRow TABLE_A%rowtype) as
begin
...
end;
procedure doSomeVisitorStuff (pRow TABLE_A%rowtype) as
begin
...
end;
end PKG_A;
-user OWNER создайте n процедур, каждая из которых вызывает одну открытую процедуру пакета:
procedure ManagerStuff (pRow TABLE_A%rowtype) as
begin
pkg_a.doSomeManagerStuff (pRow);
end;
procedure DataEntryStuff (pRow TABLE_A%rowtype) as
begin
pkg_a.doSomeDataEntryStuff (pRow);
end;
procedure VisitorStuff(pRow TABLE_A%rowtype) as
begin
pkg_a.doSomeVisitorStuff (pRow);
end;
- пользователь OWNER создает роли ROLE_MANAGER, ROLE_DATAENTRY, ROLE_VISITOR
- пользователь OWNER grant ONLY выполняет процедуру для соответствующей роли
на этом этапе вЧтобы проверить безопасность, я создаю другого пользователя с другой ролью и пробую скрипт, подобный этому:
/** CONNECTED AS USERMANAGER **/
declare
lRow OWNER.TABLE_A%rowtype; /* --- Which privilege I need to grant? --- */
begin
lRow.field1 := value;
...
OWNER.ManagerStuff(lRow);
end;
Я хотел бы работать с процедурами, передающими один параметр, который представляет всю таблицустрока.Таким образом, моя воля состоит в том, чтобы не изменять каждую процедуру каждый раз, когда я изменяю структуру таблицы или бизнес-логику, применяемую в пакете.
Будем благодарны за любые предложения или другие подходы.