DBA_ROLE_PRIVS是唯一能查出“哪些用户被授予了哪个角色”的系统视图,但需DBA或SELECT_CATALOG_ROLE权限;普通用户无权访问,只能查USER_ROLE_PRIVS和SESSION_ROLES。
dba_role_privs 是唯一能查出「哪些用户被授予了哪个角色」的系统视图,但必须用具有 select_catalog_role 或 dba 权限的账号(比如 system 或 sys)才能访问。
为什么直接查 DBA_ROLE_PRIVS 可能返回空?
常见错误是用普通用户登录后执行:SELECT * FROM DBA_ROLE_PRIVS;
这会报错 ORA-00942: table or view does not exist —— 不是因为表不存在,而是当前用户没权限读这个视图。
- 普通用户默认只能查
USER_ROLE_PRIVS(只显示自己被授了哪些角色) -
ALL_ROLE_PRIVS并不存在,Oracle 没这个视图 - 想看别人被授了什么角色,非
DBA或授权用户不可
查指定角色授予了哪些用户(例如 CONNECT)
在有权限账号下运行:
SELECT GRANTEE, GRANTED_ROLE, ADMIN_OPTION, DEFAULT_ROLE FROM DBA_ROLE_PRIVS WHERE GRANTED_ROLE = 'CONNECT';
注意点:
-
GRANTEE是被授角色的用户或角色名(可能是另一个角色,形成嵌套) -
ADMIN_OPTION = 'YES'表示该用户可再把此角色授予他人 -
DEFAULT_ROLE = 'YES'表示登录时该角色自动激活;为'NO'时需手动SET ROLE - 角色名严格区分大小写,
'connect'会查不到,必须用'CONNECT'
查指定用户被授予的所有角色(例如用户 SCOTT)
同样需 DBA 权限:
SELECT GRANTED_ROLE, ADMIN_OPTION, DEFAULT_ROLE FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'SCOTT';
补充说明:
- 结果不含角色继承链里的间接权限,只列直接授予的那些角色
- 若想合并查出 SCOTT 的所有系统权限(含角色带来的),得联合
DBA_SYS_PRIVS和子查询,不能只靠这一张表 - 如果
GRANTEE列值是另一个角色名(比如'APP_DEVELOPER'),说明这是角色到角色的授权,不是授给用户的
没有 DBA 权限时能做什么?
普通用户只能退而求其次:
- 查自己被授了哪些角色:
SELECT * FROM USER_ROLE_PRIVS; - 查自己当前激活的角色:
SELECT * FROM SESSION_ROLES;(注意:未激活的角色不会出现在这里) - 查自己拥有的系统权限:
SELECT * FROM SESSION_PRIVS; - 想确认某张表能不能操作,直接
SELECT/INSERT测试比查权限更可靠——权限可能来自角色、对象权限、甚至细粒度策略,视图未必全覆盖
真正麻烦的地方不在 SQL 写法,而在于权限来源可能是多层嵌套的:用户 → 角色 A → 角色 B → 系统权限。单靠 DBA_ROLE_PRIVS 只能看到第一层“谁被给了什么角色”,后面还得顺藤摸瓜查 ROLE_ROLE_PRIVS 和 ROLE_SYS_PRIVS。


















