Oracle授予SELECT ANY TABLE权限后无法在dba_tab_privs查到记录的问题
问题核心原因
SELECT ANY TABLE 是Oracle的系统权限,而非对象权限,你查询的DBA_TAB_PRIVS视图仅存储对象级权限的授予记录,因此无法匹配到该权限的相关数据。
视图权限存储范围说明
DBA_TAB_PRIVS:仅记录针对特定对象(例如具体表、视图、存储过程等)的对象权限授予记录,只有类似GRANT SELECT ON scott.emp TO BARTSIMPSON这类指定了具体对象的授权,才会写入该视图。DBA_SYS_PRIVS:存储所有系统级权限的授予记录,你执行的GRANT SELECT ANY TABLE TO BARTSIMPSON属于系统权限,相关记录会保存在该视图中。
验证授权结果的方法
执行以下SQL即可查询到对应的授权记录:
SELECT grantee, privilege, admin_option FROM dba_sys_privs WHERE grantee = 'BARTSIMPSON' AND privilege = 'SELECT ANY TABLE';
额外排查场景
如果执行上述语句依然无返回结果,可检查是否是将SELECT ANY TABLE权限授予给了BARTSIMPSON所属的角色,而非直接授予用户本人:
- 先查询用户所属的所有角色
SELECT granted_role FROM dba_role_privs WHERE grantee = 'BARTSIMPSON';
- 再查询对应角色是否被授予了目标系统权限
SELECT grantee, privilege, admin_option FROM dba_sys_privs WHERE privilege = 'SELECT ANY TABLE' AND grantee IN (上一步查询到的角色列表);
内容的提问来源于stack exchange,提问作者CrazyCoder
相关产品推荐
相关产品推荐

