当前用户显式授予的角色查 user_role_privs,实际启用角色查 session_roles;指定用户角色需 dba 权限查 dba_role_privs;刚授权未生效常因未重新登录或未设默认角色。
查当前用户被授予了哪些角色
直接查 user_role_privs 就行,它只返回当前登录用户被显式授予的角色(不含嵌套继承、不含未激活角色):
SELECT role, admin_option, default_role FROM USER_ROLE_PRIVS;
ADMIN_OPTION 为 YES 表示该角色可被当前用户再授予他人;DEFAULT_ROLE 为 YES 表示该角色在会话中默认激活(否则需手动 SET ROLE)。
常见误区:以为这里能看到所有“有效角色”,其实它不包含通过其他角色间接获得的角色,也不反映当前会话实际启用的角色集合。
查当前会话实际启用的角色
用 SESSION_ROLES —— 这才是你此刻真正能用上的角色列表:
SELECT role FROM SESSION_ROLES ORDER BY role;
这个视图反映的是当前连接中已激活的角色,包括:
• 直接授予且 DEFAULT_ROLE = 'YES' 的角色
• 手动执行过 SET ROLE 激活的角色
• 嵌套继承来的角色(只要父角色已激活,子角色也会出现在这里)
注意:SESSION_ROLES 不显示 ADMIN_OPTION 或是否默认,只回答“我现在能用谁”这一个问题。
查指定用户被授了哪些角色(需DBA权限)
如果你有 SELECT_CATALOG_ROLE 或 DBA 权限,查 DBA_ROLE_PRIVS:
SELECT grantee, granted_role, admin_option, default_role FROM DBA_ROLE_PRIVS WHERE grantee = 'SCOTT';
关键点:
• grantee 是用户名,必须大写(Oracle 默认转大写,但显式写时别小写)
• 结果不含角色内部的权限,只管“谁被给了哪个角色”
• 如果查不到,先确认用户是否存在(SELECT * FROM DBA_USERS WHERE USERNAME = 'SCOTT')
没有 DBA 权限时,无法查别人,USER_ROLE_PRIVS 和 SESSION_ROLES 是仅有的两个可用入口。
为什么查不到刚授予的角色?
刚执行 GRANT myrole TO scott; 后立刻查 USER_ROLE_PRIVS 却为空,通常是因为:
• 你没用 scott 用户重新登录(角色授予后需新会话才可见于 USER_ROLE_PRIVS)
• 角色未设为默认(DEFAULT_ROLE = 'NO'),导致 SESSION_ROLES 里也看不到,除非手动 SET ROLE myrole;
• 授予语句没加 COMMIT(虽然 DDL 隐式提交,但某些工具或脚本封装可能干扰)
最稳妥验证方式:换一个连接,以目标用户登录,再查 SESSION_ROLES —— 这才是真正影响权限生效的环节。











