首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle VPD/RLS的谓词错误

Oracle VPD/RLS的谓词错误
EN

Stack Overflow用户
提问于 2012-01-22 06:54:14
回答 2查看 5.6K关注 0票数 1

我需要一些关于Oracle的RLS特性的帮助。我以前从未使用过它,但我在网上做了一些研究,但我遇到了一个问题。

以下是我采取的步骤:

1-创建函数:

代码语言:javascript
复制
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-添加安全策略

代码语言:javascript
复制
Begin

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

End;

3-在对象上运行简单的select查询

代码语言:javascript
复制
select * from db1.data

当我执行步骤3时,我得到以下错误:

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

我不知道安全功能会出什么问题。我成功地在db1模式上手动使用了它,如下所示:

代码语言:javascript
复制
select * from data
where project = (select project from users where user_name = (select sys_context('userenv','session_user') from dual))

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-22 22:18:20

因为您的策略函数在admin模式上,所以您应该用它的模式限定users表中的select:

代码语言:javascript
复制
v_project:= '(select project from db1.users where user_name = (select sys_context(''userenv'',''session_user'') from dual))';

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

票数 2
EN

Stack Overflow用户

发布于 2012-01-22 22:03:54

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

  • 是要将策略应用于table_access_policy模式下的函数admin的表?
  • 是否已向所有必需的用户授予了对table_access_policy函数的EXECUTE权限?

我不认为问题在于参数是否区分大小写,因为Oracle's own examples使用hr等小写的对象名称。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8957425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档