PLS-00320: объявление типа этого выражения неполное или неправильное - ВОПРОС ORIVLE PRIVILEGES - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь реализовать защиту базы данных, как описано в 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;
    

Я хотел бы работать с процедурами, передающими один параметр, который представляет всю таблицустрока.Таким образом, моя воля состоит в том, чтобы не изменять каждую процедуру каждый раз, когда я изменяю структуру таблицы или бизнес-логику, применяемую в пакете.

Будем благодарны за любые предложения или другие подходы.

1 Ответ

0 голосов
/ 21 сентября 2018

Я использую ответ, чтобы лучше раскрыть решение.

Комментарий Уильяма Робертсона верен, но я прочитал здесь о привилегии SELECT.Поэтому я не хочу, чтобы пользователи имели прямой доступ к моим таблицам, и с привилегией READ я могу ссылаться на rowtype следующим образом:

declare
 lRow owner.table_a%rowtype;
begin
 null;
end;

Я читаю this ихотя пост старый, я пытаюсь это:

  • Я создаю пакет без тела, как это:

    create or replace PACKAGE PKG_TYPES AS 
    
      subtype table_A_rt is table_A%rowtype;
      subtype table_B_rt is table_B%rowtype;
      subtype table_C_rt is table_C%rowtype;
      ...
    
    END PKG_TYPES
    
  • grant EXECUTE on pkg_types to ROLE_MANAGER

  • теперь можно ссылаться на тип строки :

    declare
     lRow asadmin.pkg_types.account_rt;
    begin
     null;
    end;
    

Я все еще работаю над этим, но, похоже, он соответствуетнеобходимо.Любые плюсы и минусы приветствуются.

...