Oracle DBMS_SCHEDULER定时任务执行报ORA-01031权限不足问题咨询
问题核心原因
Oracle调度器自动运行作业时,启动的会话默认不会激活用户的角色权限,仅识别直接授予用户的显式权限。你手动执行存储过程、手动调用RUN_JOB时,当前会话已经激活了所有分配给你的默认角色,角色附带的权限生效,所以执行正常;自动调度时角色权限被忽略,就会触发权限不足报错。
你遇到的场景基本都是以下两种情况导致:
- 你的存储过程包
MY_PKG使用了AUTHID CURRENT_USER(调用者权限)模式,执行时依赖调用者的会话权限 - 报错行涉及的SELECT权限是通过角色授予的,没有直接授予作业所属的SCOTT用户,即使查询的是同schema的表,如果涉及系统视图也会出现这类问题
排查步骤
- 确认包的权限模式
SELECT authid FROM all_procedures WHERE object_name = 'MY_PKG' AND owner = 'SCOTT';
如果返回结果为CURRENT_USER,说明包为调用者权限模式,会受角色权限限制。
2. 确认权限授予方式
-- 替换your_table_name为246行SELECT语句的目标表名 SELECT privilege, grantor FROM all_tab_privs WHERE table_name = 'YOUR_TABLE_NAME' AND grantee = 'SCOTT';
如果查询不到对应SELECT权限记录,说明权限是通过角色授予的,调度场景不生效。如果涉及的是V$、DBA_开头的系统视图,默认权限都是通过SELECT_CATALOG_ROLE角色授予,必然会触发该问题。
解决方案
可根据你的场景任选一种:
- 方案1:显式授予对应权限
直接将需要的SELECT权限授予SCOTT用户,对系统视图也适用:
-- 普通表授权 GRANT SELECT ON your_table_name TO SCOTT; -- 系统视图授权示例 GRANT SELECT ON V$SESSION TO SCOTT;
- 方案2:给作业配置允许使用的角色
显式指定作业运行时需要激活的角色,不需要修改权限配置:
BEGIN DBMS_SCHEDULER.SET_ATTRIBUTE( name => 'MY_JOB', attribute => 'ROLES', value => 'RESOURCE,SELECT_CATALOG_ROLE' -- 替换为你实际用到的角色名 ); END; /
- 方案3:修改包为定义者权限模式
如果不需要调用者权限特性,将包头部的AUTHID CURRENT_USER改为AUTHID DEFINER(默认值,也可以直接删除该声明),重新编译包即可。
内容的提问来源于stack exchange,提问作者Sid
相关产品推荐
相关产品推荐

