You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle 19c存储过程调用PUBLIC视图:为何一成功一执行报错?

Oracle 19c中存储过程调用SYS.V_$RESTORE_POINT权限异常原因分析

核心规则前提

定义者权限模式的存储过程执行时,仅生效直接授予给存储过程定义者的对象权限,所有角色(包括PUBLIC角色)的权限都会被禁用——这是Oracle官方明确的权限控制规则。

三个场景差异解析

  • 场景1:用户自定义视图调用正常
    用户A将视图A.a_public的READ权限直接授予PUBLIC,等同于给用户B(PUBLIC成员)直接赋予了该视图的访问权限。用户B作为存储过程定义者,拥有对该视图的直接权限,因此执行存储过程时权限校验通过。

  • 场景2:SYS.V_$RESTORE_POINT执行报错
    虽然PUBLIC被授予了该视图的READ权限,但这类动态性能视图的权限是通过角色间接授予的(比如依赖SELECT_CATALOG_ROLE等系统角色的权限传递),而非直接将视图的SELECT权限授予PUBLIC用户本身。
    在定义者权限存储过程中,角色权限被禁用,用户B没有被直接授予SYS.V_$RESTORE_POINT的SELECT权限,因此执行时触发ORA-01031权限不足错误。

  • 场景3:SYS.V_$SESSION_CONNECT_INFO调用正常
    该视图的SELECT权限是直接授予给PUBLIC用户的,并非通过角色传递。用户B作为PUBLIC成员,拥有对该视图的直接访问权限,因此在定义者权限存储过程中可以正常执行。

验证方法

通过查询系统视图确认权限类型:

SELECT grantee, granted_role, privilege
FROM dba_tab_privs
WHERE table_name IN ('V_$RESTORE_POINT', 'V_$SESSION_CONNECT_INFO');
  • 对于V_$SESSION_CONNECT_INFO,会看到granted_role为NULL,说明是直接权限;
  • 对于V_$RESTORE_POINT,granted_role会显示对应的系统角色,说明是角色间接授予的权限。

内容的提问来源于stack exchange,提问作者Alex Bartsmon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 17:21:05