最近看了一下关于oracle的用户权限的相关视图,现在将自己的一点总结分享一下:
如果你想查询一个用户都有哪些权限,你可以这样做
1 登录这个用户
2 查询session_privs 视图,得到这个用户所有的系统权限。
2 查询user_tab_privs_made和user_tab_privs_recd 查询该用户的对象权限,前者为授出去的权限,后者为得到的权限,注意这些权限是不包含在角色中的权限。
3 查询user_role_privs得到该用户被授予的所有角色,如果存在非默认角色,那么你可以查询session_roles得到当前会话拥有的所有角色。
3 查询role_sys_privs和role_tab_privs分别得到角色中锁包含的所有系统权限和对象权限
注意,session_privs 查到的权限是用户所有的系统权限,是user_sys_privs的所有内容加上role_sys_privs的所有内容的集合,user_sys_privs只包含用户单独被授予的系统权限,而dba_sys_privs却包含了所有角色和用户单独被授予的系统权限,这块比较容易让人混淆。
如果以sysdba用户登录的话
1 查询dba_sys_pris,在granteez字段过滤该用户,得到该用户的非角色中的系统权限,注意dba_sys_privs包含了用户锁拥有的角色外系统权限和每个角色拥有的系统权限。
2 查询dba_tab_privs 在grantee字段过滤该用户,得到该用户非角色中的对象权限,注意dba_tab_privs包含了用户锁拥有的角色外对象权限和每个角色拥有的对象权限。
3 查询dba_role_privs 在grantee字段过滤该用户,得到该用户被赋予的所有角色,注意dba_role_privs包含了用户被授予的角色和角色间的嵌套关系。
4 查询role_sys_prvs和role_tab_privs在grantee字段过滤该用户被赋予的角色,就可以知道这些角色中包含的权限,从而知道该用户锁拥有的角色中的权限,和用户下的role_sys_privs视图和role_tab_privs不同,sysdba下的这两个视图是包含了数据库中所有的角色的,而用户下的这两个视图之包含了用户自己拥有的角色,虽然视图名称是一样的,内容却是sysdba的子集。
dba_sys_privs包含role_sys_privs的内容和单独授予用户的系统权限
在这些视图中,用户和角色的地位是相同的,如果有掐套的角色存在,那么可以逐层的按照以上方法,找到最终的权限。