必须查SESSION_ROLES视图,因为它唯一反映当前会话实际生效的角色;USER_ROLE_PRIVS仅显示授予记录,不区分是否激活,而SESSION_ROLES实时展示已启用角色,为空则无激活角色。

直接查 SESSION_ROLES 视图,这是唯一反映“当前已激活角色”的权威来源。
为什么必须用 SESSION_ROLES 而不是 USER_ROLE_PRIVS
USER_ROLE_PRIVS 只告诉你“被授予过哪些角色”,不区分是否启用;而 SESSION_ROLES 显示的是当前会话实际生效的角色列表——也就是真正能用的权限集合。常见错误是查了 USER_ROLE_PRIVS 发现角色存在,但执行操作仍报权限不足,就是因为该角色没被默认激活(DEFAULT_ROLE 为 FALSE)或被显式 SET ROLE 切换掉了。
-
SESSION_ROLES是只读视图,无需额外权限,当前用户可直接查 - 返回结果中
ROLE列即为已激活角色名,无其他字段干扰 - 若结果为空,说明当前会话没有激活任何角色(仅保留系统默认权限,如
CREATE SESSION)
SESSION_ROLES 和 USER_ROLE_PRIVS 的关键差异
同一个用户可能在 USER_ROLE_PRIVS 里看到 5 个角色,但在 SESSION_ROLES 里只显示 2 个——这说明另外 3 个角色虽被授予,但未设为默认角色,或曾被 SET ROLE 手动禁用过。
-
USER_ROLE_PRIVS.DEFAULT_ROLE为TRUE的角色,连接后自动激活;为FALSE则需显式SET ROLE role_name -
SESSION_ROLES不受DEFAULT_ROLE设置影响,它只反映当前 实时生效 的角色上下文 - 如果用
ALTER USER ... DEFAULT ROLE NONE清空默认角色,SESSION_ROLES就只剩空集,哪怕USER_ROLE_PRIVS仍有记录
如何确认某个角色是否真正在当前会话起作用
不能只看角色是否存在,得验证它带来的具体权限是否可用。最直接的方式是查 SESSION_PRIVS,它列出当前会话拥有的所有系统权限(含角色继承来的)。
- 运行
SELECT * FROM SESSION_PRIVS,搜索你关心的权限名(如SELECT ANY TABLE) - 如果没查到,即使
SESSION_ROLES里有对应角色,也说明该角色没被正确激活,或角色本身没被赋予该权限 - 注意:
SESSION_PRIVS不显示对象权限(如对某张表的 SELECT),对象权限要结合USER_TAB_PRIVS或SESSION_ROLES+ 实际 SQL 测试
真正容易被忽略的是:角色激活状态是会话级的,不受用户级默认设置以外的任何全局配置隐式影响;每次新连接、或执行 SET ROLE 后,SESSION_ROLES 都会重算,不存在缓存或延迟生效的情况。


















