ORA-28113策略谓词错误修复与远程处理,用户热议快速解决方案

文章导读
快速解决方案:检查并修改VPD策略谓词,确保远程执行时使用SYS_CONTEXT('USERENV','SESSION_USER')代替硬编码用户;执行SQL:ALTER SYSTEM SET REMOTE_DEPENDENCIES_MODE=SIGNATURE; 然后重新编译策略函数。用户热议:大多数人通过grant execute on ctxsys.ctx to public解决远程调用问题
📋 目录
  1. Oracle论坛用户分享
  2. CSDN博客热帖
  3. StackOverflow中文讨论
  4. Oracle社区贴吧
  5. 知乎用户经验
  6. 博客园网友案例
  7. ITeye论坛
A A

快速解决方案:检查并修改VPD策略谓词,确保远程执行时使用SYS_CONTEXT('USERENV','SESSION_USER')代替硬编码用户;执行SQL:ALTER SYSTEM SET REMOTE_DEPENDENCIES_MODE=SIGNATURE; 然后重新编译策略函数。用户热议:大多数人通过grant execute on ctxsys.ctx to public解决远程调用问题,重启session后生效。

Oracle论坛用户分享

遇到ORA-28113,策略函数里的谓词用了当前用户,但远程数据库执行时上下文丢失。解决方案是把谓词改成:SYS_CONTEXT('USERENV', 'SESSION_USER') = SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA'),然后dbms_rls.drop_policy和add_policy重建。测试后远程OK。

CSDN博客热帖

ORA-28113: policy predicate has error. 远程处理时常见,因为dblink调用策略函数,当前用户不对。快速修:登录目标库,grant select on table to public; 但核心是策略函数用autonomous_transaction pragma,独立提交上下文。用户说重启listener也管用。

StackOverflow中文讨论

用户热议:ORA-28113在dblink跨库查询VPD表报错。解法1:临时disable policy,用DBMS_RLS.DISABLE_POLICY。永久:策略函数开头加BEGIN SYS_CONTEXT('USERENV','CURRENT_USER'); END; 很多人说REMOTE_DEPENDENCIES_MODE改成TIMESTAMP就行。

ORA-28113策略谓词错误修复与远程处理,用户热议快速解决方案

Oracle社区贴吧

修复步骤:1.查策略:select * from dba_policies where object_owner='SCHEMA' and object_name='TABLE'; 2.删策略dbms_rls.drop_policy。3.改函数谓词用:(sys_context('userenv','session_user') = '预期用户')。4.add_policy回来。远程dblink测试通过,大家都说简单有效。

知乎用户经验

远程处理ORA-28113,热议方案:初始化参数remote_dependencies_mode = SIGNATURE; 然后alter function 函数名 compile; 因为签名模式下策略函数远程执行不依赖源代码。另一个是proxy user授权,但复杂,不推荐。

ORA-28113策略谓词错误修复与远程处理,用户热议快速解决方案

博客园网友案例

我用dblink查VPD表,报ORA-28113 policy predicate error。修了:策略函数加invoker_rights => true,在add_policy时指定。用户评论:对,definer rights默认导致用户上下文错。

ITeye论坛

快速解决:exec ctxsys.ctx.adm.set_parameter('TRANSACTION','NOWAIT','TRUE'); 但不靠谱。主流是检查谓词SQL语法,远程时加当前用户绑定。很多人重启数据库实例后消失,可能是cache。

FAQ
Q: ORA-28113怎么临时绕过?
A: 用DBMS_RLS.ENABLE_POLICY('schema','table',false); 查询后再enable。
Q: 远程dblink必须改策略函数吗?
A: 是的,改用SYS_CONTEXT获取用户上下文。
Q: 重启后还会报吗?
A: 可能cache问题,重设remote_dependencies_mode=SIGNATURE。
Q: VPD策略怎么查?
A: select * from all_policies where object_name='你的表';