ORA-01955错误因误将ALL当作角色名使用;正确做法是显式列出已授角色,或12.2+用DEFAULT ROLE ALL PRIVILEGES(不含ADMIN OPTION角色)。
执行 ALTER USER DEFAULT ROLE ALL 报错 “ORA-01955: default role ‘ALL’ does not exist”
oracle 不允许直接把 all 当作一个真实角色名写进 default role 子句——它只是个关键字,不是数据库里注册的角色。你看到的错误说明 oracle 正在按字面去查一个叫 all 的角色,自然找不到。
正确做法是显式列出所有想设为默认的角色,或者用 ALL PRIVILEGES 语法(仅限 12cR2+):
-
ALTER USER scott DEFAULT ROLE CONNECT, RESOURCE;—— 明确指定已存在且已授予该用户的角色 -
ALTER USER scott DEFAULT ROLE ALL;❌ 错误:ALL不是角色名,不能这样用 -
ALTER USER scott DEFAULT ROLE ALL PRIVILEGES;✅ 12.2+ 支持,表示“所有当前已授予该用户的角色都设为默认”,但注意:不包括ADMIN OPTION角色,也不包含未显式GRANT过的角色
DEFAULT ROLE 对新会话生效的时机和限制
设置完 DEFAULT ROLE 后,不会影响当前已登录的会话;必须重新连接才能生效。而且,即使设了默认角色,如果该角色被 SET ROLE NONE 或 ALTER USER ... DEFAULT ROLE NONE 清空过,下次登录也不会自动激活任何角色。
- 角色必须已通过
GRANT role_name TO user_name授予该用户,否则无法出现在默认列表中 -
DEFAULT ROLE只控制会话初始激活哪些角色,不影响权限继承逻辑(比如角色嵌套、WITH ADMIN OPTION) - 若用户有
OS_AUTHENT_PREFIX配置或使用外部认证,DEFAULT ROLE可能被绕过或忽略
为什么 ALTER USER ... DEFAULT ROLE ALL 在脚本里常被误用
很多人抄文档片段时没注意上下文,把 ALL 当成通配符用了。实际上 Oracle 文档里写的是 “ALL — specifies that all roles granted to the user are enabled”,但它只在 SET ROLE ALL 或 ALTER USER ... DEFAULT ROLE ALL PRIVILEGES 中合法,且版本敏感。
- 11g 及更早版本:不支持
ALL PRIVILEGES,只能手动列全角色名 - 12cR1:支持
ALL PRIVILEGES,但要求角色是通过GRANT ... WITH ADMIN OPTION授予的才可能被包含(实际行为不稳定,建议避免) - 12cR2+:
ALL PRIVILEGES行为稳定,但依然不包含ADMIN OPTION角色,也不包含未激活的IDENTIFIED EXTERNALLY角色
检查当前用户的默认角色配置
别靠猜,用系统视图确认实际生效状态:
SELECT granted_role, default_role FROM dba_role_privs WHERE grantee = 'SCOTT';
注意:DEFAULT_ROLE 列为 YES 才表示该角色被设为默认;NO 表示虽已授予,但不会在登录时自动启用。
-
dba_role_privs要 DBA 权限;普通用户可用user_role_privs - 如果某角色在
dba_role_privs里DEFAULT_ROLE = NO,但你又希望它默认启用,必须重执行ALTER USER ... DEFAULT ROLE ...并包含它 - 角色名大小写敏感,尤其当角色用双引号创建时(如
"MyRole"),DEFAULT ROLE中也必须严格匹配
事情说清了就结束。最常出问题的地方是:以为 ALL 是万能占位符,结果在 11g 或没开 PRIVILEGES 选项的环境里硬写,然后卡在报错里反复试。










