PLS-00320:此表达式类型的声明不完整或格式不正确-ORACLE PRIVILEGES ISSUE

时间:2018-09-20 08:58:10

标签: oracle privileges

我正在尝试实现《 Oracle数据库安全指南》中公开的数据库安全性,而我的情况是这样的:

  • 用户OWNER创建表TABLE_A;
  • 用户OWNER创建一个包PKG_A,将其包装在TABLE_A上的业务逻辑如下:

    setup.template.name: "your_template_name"
    setup.template.fields: "path/to/NewFieldsFile.yml"
    

-用户OWNER创建n个过程,每个过程调用程序包的单个公共过程:

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;
  • 用户OWNER创建角色ROLE_MANAGER,ROLE_DATAENTRY,ROLE_VISITOR
  • 用户OWNER授予执行相应角色的过程
  • 这时为了测试安全性,我创建了具有不同角色的其他用户,并尝试了如下脚本:

    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;
    

我想使用传递单个参数的过程来代表整个表行。这样,我的意愿是不必每次更改包中的表结构或业务逻辑时都修改每个过程。

任何建议或其他方法将不胜感激。

1 个答案:

答案 0 :(得分:0)

我使用答案来更好地揭示解决方案。

William Robertson的评论是正确的,但我阅读了here有关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;
    

我仍在努力,但这似乎可以满足我的需求。 任何利弊都受到赞赏。