Oracle VPD / RLS的谓词错误

时间:2012-01-21 22:54:14

标签: sql oracle

我需要Oracle的RLS功能方面的一些帮助。我之前从未使用它,但在网上做了一些关于它的研究,但是我遇到了一个问题。

以下是我采取的步骤:

1-创建功能:

create or replace function
   table_access_policy
   (obj_schema varchar2, obj_name varchar2) return varchar2

is                

v_project varchar2(2000);

begin              

v_project:= '(select project from users where user_name = (select sys_context(''userenv'',''session_user'') from dual))';

return 'project = ' || v_project;       

end;

2-添加安全策略

Begin

DBMS_RLS.ADD_POLICY ('db1', 'data', 'access_policy', 'admin', 'table_access_policy', 'SELECT' );

End;

3-对对象运行简单的选择查询

select * from db1.data

当我执行第3步时,我收到以下错误:

ORA-28113:策略谓词有错误 28113. 00000 - “政策谓词有错误” *原因:策略函数生成无效谓词。 *操作:查看跟踪文件以获取详细的错误信息。 行错误:5列:14

我不知道安全功能有什么问题。我在db1架构上成功地使用了它,如下所示:

select * from data
where project = (select project from users where user_name = (select sys_context('userenv','session_user') from dual))

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

由于您的策略功能在管理架构上,因此您应该使用其架构限定users表中的select:

v_project:= '(select project from db1.users where user_name = (select sys_context(''userenv'',''session_user'') from dual))';

此外,您应该按照建议检查跟踪文件,因为它会显示运行的确切SQL以及真正的错误消息。

答案 1 :(得分:0)

我手边没有Oracle企业版副本(VPD仅限企业版),因此我只能猜测导致问题的几个可能原因:

  • 您希望应用该政策的表格db1.data
  • table_access_policy架构下的函数admin是什么?
  • 是否已为EXECUTE函数授予所有必要用户table_access_policy权限?

我不认为问题是区分大小写的,因为Oracle's own examples使用小写的对象名称,例如hr