ORA-01955错误:误用ALL作为角色名及其正确解决方案 ALTER USER DEFAULT ROLE ALL 报错 ORA-01955 的原因 许多用户在设置默认角色时,常因误解 ALL 关键字而遇到错误。Oracle 数据库中的 ALL 并非一个实际存在的角色对象,而是一个保留关键字。当执
许多用户在设置默认角色时,常因误解 ALL 关键字而遇到错误。Oracle 数据库中的 ALL 并非一个实际存在的角色对象,而是一个保留关键字。当执行 ALTER USER ... DEFAULT ROLE ALL 命令时,数据库会尝试查找名为“ALL”的角色,因无法找到而报错“ORA-01955: default role ‘ALL’ does not exist”。
要正确设置用户的默认角色,应使用以下两种方式之一:
长期稳定更新的攒劲资源: >>>点此立即查看<<<
ALTER USER scott DEFAULT ROLE CONNECT, RESOURCE;。这是最可靠的方法,需明确指定已授予该用户的具体角色。ALTER USER scott DEFAULT ROLE ALL PRIVILEGES;。此命令会将所有已通过 GRANT 语句授予该用户的角色设为默认。但需注意,通过 ADMIN OPTION 获得的角色不会被包含在内。错误示例如下:ALTER USER scott DEFAULT ROLE ALL; 此写法无效,因为 ALL 不是角色名。
默认角色的设置仅对新建立的会话生效,当前已存在的会话不受影响。用户需要重新登录才能使新配置生效。
此外,默认角色功能存在以下限制:
GRANT role_name TO user_name 授予用户,才能被设为默认角色。DEFAULT ROLE 仅控制用户登录时自动激活哪些角色,不涉及角色嵌套权限或 WITH ADMIN OPTION 等管理选项。OS_AUTHENT_PREFIX 或使用外部认证,DEFAULT ROLE 机制可能被绕过或失效。还需注意,若用户曾执行 SET ROLE NONE 或 ALTER USER ... DEFAULT ROLE NONE 清空默认设置,则后续登录时不会有角色自动激活。
此错误常源于对文档语句的片面理解。文档中“ALL — specifies that all roles granted to the user are enabled”的描述,易被误解为 ALL 可直接用作通配符。
实际上,ALL 关键字仅在特定语法环境中有效,例如 SET ROLE ALL 或 ALTER USER ... DEFAULT ROLE ALL PRIVILEGES。不同 Oracle 版本的行为差异如下:
ALL PRIVILEGES 语法,必须显式列出所有角色名。ALL PRIVILEGES,但行为可能不稳定,不建议在此版本依赖此功能。ALL PRIVILEGES 行为稳定,但仍不包含通过 ADMIN OPTION 获得的角色及未激活的外部标识角色。通过查询系统视图可准确确认默认角色状态:
SELECT granted_role, default_role FROM dba_role_privs WHERE grantee = 'SCOTT';
查询结果中,DEFAULT_ROLE 列为 YES 表示该角色已设为默认,登录时自动启用;为 NO 则表示需手动执行 SET ROLE 激活。
dba_role_privs 通常需要 DBA 权限。普通用户可查询 user_role_privs 视图查看自身角色信息。DEFAULT_ROLE = NO 的角色改为默认启用,需重新执行 ALTER USER ... DEFAULT ROLE ... 命令并包含该角色名。"MyRole"),在命令中必须严格匹配。总结而言,最常见的错误是将 ALL 当作通配符使用,尤其在 Oracle 11g 环境或遗漏 PRIVILEGES 关键字时。理解版本差异并正确使用语法,可有效避免 ORA-01955 错误。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述