ora-01031在pl/sql中报错主因是角色权限不可见,oracle默认禁止存储过程使用角色授予的权限;必须显式授予系统或对象权限(如grant select any dictionary to user),或改用authid current_user,并确认session_roles已启用、表空间配额充足、客户端授权已提交。

PL/SQL里调用函数/过程报ORA-01031,不是权限没给,是权限“不可见”
Oracle默认禁止PL/SQL代码使用通过角色获得的权限——哪怕你已经GRANT CONNECT TO user、GRANT SELECT_CATALOG_ROLE TO user,只要没显式授予,存储过程一执行就崩。这不是配置遗漏,是Oracle硬性安全机制。
常见现象:在SQL*Plus里SELECT * FROM dba_users能跑通,但包体里写同样语句编译或运行就报ORA-01031: insufficient privileges。
- 必须对用户直接授予所需系统权限,例如:
GRANT SELECT ANY DICTIONARY TO your_user(替代SELECT_CATALOG_ROLE) - 对象权限也得直授:
GRANT SELECT ON sys.dba_users TO your_user,不能只靠角色间接获得 - 若用
DEFINER'S RIGHTS(默认),权限检查以定义者身份进行,但定义者若本身没直授权限,照样失败 - 改用
INVOKER'S RIGHTS可绕过部分限制,但需在创建时明确声明:CREATE OR REPLACE PROCEDURE p AUTHID CURRENT_USER AS ...
ALTER USER DEFAULT ROLE ALL 之后还是不行?检查SESSION_ROLES
即使你执行了ALTER USER your_user DEFAULT ROLE ALL,PL/SQL运行时仍可能不启用角色——因为会话启动后角色默认未激活,尤其JDBC、Navicat等客户端连接时不会自动SET ROLE。
验证当前会话实际启用的角色:
SELECT * FROM SESSION_ROLES;
如果返回空,说明角色虽已授予但未启用。手动启用:
- 有密码的角色:
SET ROLE role_name IDENTIFIED BY password - 无密码角色:
SET ROLE role_name - 启用所有可启用角色:
SET ROLE ALL
注意:SET ROLE只对当前会话生效,且无法在PL/SQL块内执行(会报ORA-06550),只能在SQL*Plus或支持该命令的客户端中预先执行。
ORA-01950:表空间配额不足,常被误判为“权限不够”
迁移或批量建表时出现ORA-01950: no privileges on tablespace 'USERS',本质不是缺权限,而是用户在USERS表空间没有配额,无法分配段空间。
典型场景:用新用户MCDBA_BAK执行全量导入,建表失败。
- 查当前配额:
SELECT tablespace_name, bytes/1024/1024 AS mb FROM dba_ts_quotas WHERE username = 'MCDBA_BAK'; - 授无限配额(推荐全量操作):
ALTER USER MCDBA_BAK QUOTA UNLIMITED ON USERS; - 授固定配额(仅限明确容量场景):
ALTER USER MCDBA_BAK QUOTA 10G ON USERS; - 若用户默认表空间不是
USERS,还需确认其DEFAULT TABLESPACE设置是否匹配操作目标
Navicat/PL/SQL Developer连上却执行失败,别只看图形界面点“OK”
图形工具里勾选CREATE SESSION或CONNECT角色后只点“OK”不点“Apply”,权限根本没提交——这是最隐蔽的漏操作。
务必验证是否真生效:
SELECT privilege FROM dba_sys_privs WHERE grantee = 'YOUR_USER' AND privilege = 'CREATE SESSION';
如果查不到,说明授权失败。此时应:
- 换SQL*Plus或sqlplus / as sysdba手动执行
GRANT CREATE SESSION TO your_user; - 确认用户名大小写:若建用户时用了双引号
"MyUser",授权时也必须用GRANT ... TO "MyUser"; - 容器数据库(CDB)环境下,检查当前连接的是CDB$ROOT还是PDB,权限需在对应容器中授予
真正卡住人的,往往不是“没授权”,而是“授权了但没生效”——比如角色未启用、配额为空、图形界面没保存、大小写不一致,这些细节不逐条验证,光重试十遍也没用。











