查DBA_ROLE_PRIVS时角色名必须大写,小写如'connect'查不到结果,正确应为'CONNECT';需用SYSTEM/SYS等高权限账号执行,普通用户会报ORA-00942;GRANTEE可能是用户、角色或PUBLIC,ADMIN_OPTION和DEFAULT_ROLE字段分别控制转授权与自动启用。
直接执行 select * from dba_role_privs where granted_role = 'connect' 会返回空——因为 oracle 内部默认以大写存储角色名,'connect' 不匹配任何记录。正确写法是用 'connect'(或 'resource'、'dba' 等)。只有建角色时显式用了双引号(如 create role "my_role"),查询时才需保持小写加单引号:where granted_role = 'my_role'。
DBA_ROLE_PRIVS 是数据字典视图,普通用户默认无权访问。执行时若报 ORA-00942: table or view does not exist,不是表不存在,而是权限不足。你需要使用具备 SELECT_CATALOG_ROLE 或 DBA 角色的账号(如 SYSTEM、SYS)连接后执行。如果只有普通账号,只能退而求其次查 USER_ROLE_PRIVS(只看自己被授了哪些角色)或 SESSION_ROLES(只看当前已激活的角色)。
结果中的 GRANTEE 列值不全是用户名:
'APP_ADMIN'),说明这是角色嵌套授权,需递归查 DBA_ROLE_PRIVS 才能定位到最终用户'PUBLIC',代表所有用户自动获得该角色,务必单独识别并评估风险ADMIN_OPTION = 'YES' 的记录,才表示该 GRANTEE 可以把此角色再授予他人DEFAULT_ROLE = 'YES' 表示登录后自动启用;为 'NO' 时,即使被授予,也需手动执行 SET ROLE 才能实际使用权限执行 GRANT CONNECT TO scott 后立刻查 DBA_ROLE_PRIVS 没结果,常见原因有:
GRANT,但没 COMMIT,数据字典不会刷新SYSTEM 授了权,但当前连接身份不是 SYSTEM 且没启用其 DBA 角色)scott 的 DEFAULT_ROLE 是 'NO',虽已授角色,但尚未激活,SESSION_ROLES 里也看不到DEFAULT_ROLE 和当前会话状态,不是查到记录就等于能用。