AWS RDS Oracle 19c运行包报ORA-00942表或视图不存在问题咨询
问题排查结论
核心原因
Oracle 存储过程(含包、函数)默认运行在定义者权限模式下,该模式下通过角色授予的权限不会生效,仅直接授予用户的权限会被识别。
你手动执行select ts# from v$tablespace正常,是因为你的用户权限是通过SELECT_CATALOG_ROLE这类角色授予的,包运行时角色权限失效,因此无法识别v$tablespace视图。
验证方法
你可以在当前用户会话下执行以下命令验证:
SET ROLE NONE; SELECT ts# FROM v$tablespace;
如果执行后同样报ORA-00942错误,即可确认是角色权限不生效导致的问题。
解决方案
方案1:直接授予用户视图查询权限
使用SYS或拥有DBA权限的用户执行授权语句,直接给包所属用户授予底层视图的查询权限:
GRANT SELECT ON SYS.V_$TABLESPACE TO 你的包所属用户名;
授权完成后重新编译包即可正常运行。
方案2:修改包为调用者权限模式
在包定义头部添加AUTHID CURRENT_USER声明,让包运行时使用调用者的权限(包含调用者通过角色获得的权限),修改示例如下:
CREATE OR REPLACE PACKAGE mypackage AUTHID CURRENT_USER IS -- 原有包定义内容: ts_name varchar2(30); sql_stmt varchar2(255); procedure create_schema (input in varchar2); END mypackage; /
修改后重新编译包即可。
额外注意
你贴出的代码中ts_name := substr(input,0,30));存在多余的右括号,若为实际代码请修正该语法错误。
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

