小编典典

Oracle VPD / RLS的谓词错误

sql

我需要有关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))

有什么想法吗??


阅读 133

收藏
2021-04-07

共1个答案

小编典典

由于您的策略功能位于管理架构上,因此您应使用其架构对用户表中的选择进行限定:

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

此外,您应按照建议的方式检查跟踪文件,因为它将向您显示运行的确切SQL以及实际的错误消息。

2021-04-07