select * from dba_roles 是查询oracle数据库所有角色的最直接语句,但需dba或select_catalog_role权限,普通用户执行会因权限不足报ora-00942;应优先用user_role_privs查自身角色,再结合role_sys_privs和dba_role_privs分析权限链路。
要查 oracle 当前数据库里所有角色,select * from dba_roles 是最直接有效的语句,但必须用具有 select_catalog_role 或 dba 权限的用户(比如 sys、system)执行,普通用户直接运行会报 ora-00942: table or view does not exist。
为什么 dba_roles 查不到数据或报错
常见原因不是语句写错,而是权限不足或视图不可见:
-
dba_roles属于数据字典视图,仅对 DBA 角色或显式授予了SELECT ANY DICTIONARY的用户开放 - 用普通用户登录后执行,Oracle 不会提示“没权限”,而是直接报“表不存在”——这是 Oracle 对安全敏感视图的默认遮蔽行为
- 即使你有
SELECT_CATALOG_ROLE,也得确认该角色当前是启用状态(SET ROLE后才生效)
dba_roles 和 user_roles 的关键区别
别混淆这两个视图的用途和访问门槛:
-
dba_roles:列出数据库中定义的所有角色(55 个左右,11g R2 起),需 DBA 级权限 -
user_roles并不存在;正确视图是user_role_privs——它只返回「当前用户被授予的角色」,无需特殊权限,任何用户都能查 - 想快速确认自己有哪些角色?直接跑
SELECT * FROM user_role_privs,结果更轻量、更实用
查角色时容易漏掉的权限链路
角色本身不直接含权限,它只是容器。真正决定能力的是角色所拥有的系统权限或对象权限:
- 查某个角色(如
CONNECT)具体能干啥:SELECT * FROM role_sys_privs WHERE role = 'CONNECT' - 查角色是否还能授给其他角色(即带
ADMIN OPTION):SELECT * FROM dba_role_privs WHERE granted_role = 'CONNECT' - 注意
RESOURCE这类内置角色在不同 Oracle 版本中权限可能变化,不能默认它包含CREATE TABLE——务必用role_sys_privs实际验证
真正麻烦的从来不是“怎么查”,而是查完发现角色 A 授予了角色 B,B 又被 C 继承,C 还带 WITH ADMIN OPTION……这种嵌套授权链,光靠单条 dba_roles 查不出来,得连查 dba_role_privs 和 role_sys_privs 才能理清。











