ORA-01931 授权角色报错怎么修复?远程处理方案有哪些?
核心结论:ORA-01931 错误在 Oracle 11.1.0.7 版本前被标识为 BUG 12873187,官方明确该权限必须直接授予用户而非角色,预计 11.2.0.4 版本完成修复。
原因分析
ORA-01931 错误的完整报错信息为"ORA-01931: cannot grant string to a role",具体表现为尝试执行GRANT UNLIMITED TABLESPACE TO "HELLO"时触发。根据官方文档解释,该错误的根本原因是 UNLIMITED TABLESPACE、REFERENCES、INDEX、SYSDBA、SYSOPER 或 SYSASM 这 6 类特权无法授予角色。技术原理在于:当 RESOURCE 角色直接授予用户时,UNLIMITED TABLESPACE 系统权限会包含在角色中,但该权限实际上是用户属性(user attribute),如果 RESOURCE 角色授予另一个角色,再由该角色授予用户,用户属性无法传播,导致用户没有任何表空间配额。
解决方案
方案一:直接授予用户(官方推荐)
步骤 1:登录 Oracle 数据库,使用系统管理员账户conn / as sysdba。步骤 2:确认授权对象为用户而非角色,执行grant unlimited tablespace to ecc_view;。步骤 3:查询系统权限确认授予成功,显示"Grant succeeded."。此方案适用于所有 Oracle 版本,是官方文档明确推荐的 Action 操作。
方案二:通过 RESOURCE 角色间接授权
步骤 1:创建角色CREATE ROLE "HELLO" NOT IDENTIFIED;。步骤 2:将 RESOURCE 角色授予该角色GRANT RESOURCE TO "HELLO";。步骤 3:将该角色授予具体用户。注意:此方案在 11.2 版本前会触发 ORA-01931,11.2 版本虽允许授予但创建表时仍会遇到 ORA-1950 错误,需升级至 11.2.0.4 版本或使用方案一。
方案三:版本升级修复
对于 11.2.0.2 版本用户,如需彻底解决此问题,需要提交 backport request 获取补丁。11.2.0.4 版本已修复 BUG 12873187,升级后可正常授予角色该权限。
注意事项
第一,不要尝试向 SYSDBA 用户或具有常规角色创建/删除权限的管理用户授予此权限,这类用户本身不能是角色。第二,2009 年 6 月 12 日的测试案例显示,即使把 RESOURCE 赋予一个 role,然后把这个 role 授权给用户,用户仍然没有 UNLIMITED TABLESPACE 的权限。第三,2012 年 5 月 9 日的论坛反馈指出,在 10g 版本上此行为被视为 Expected behaviour,不是临时故障。第四,使用 GRANT/REVOKE 权限时建议仅使用系统管理员操作,以确保安全性。
参考来源
来源:CSDN 博客 - ORA-01931: cannot grant UNLIMITED TABLESPACE to a role(2009 年 6 月 12 日)
来源:CSDN 博客 - ORA-01931 on 10g BUG 12873187 版本修复说明(2012 年 5 月 9 日)
来源:Oracle 官方文档 - ORA-01931 错误 Cause 与 Action 解释(2025 年 7 月 5 日)
来源:Oracle 错误总结及问题解决 - ORA 错误代码案例(2025 年 4 月 17 日)