我确定以前已经有人问过这个问题,但是我似乎找不到下面的相关详细信息。

是否有某种可以完成以下操作的预建表格(我已经使用过dba_tab_privs,但它是有限的,不能满足我的所有需求),如果没有人对下面的回答有疑问?


列出分配了特定角色的所有用户?
列出授予用户的所有角色?
列出授予用户的所有特权?
列出某个角色赋予SELECT访问权限的表?
列出用户可以从中选择的所有表列出所有可以在特定表上进行SELECT的用户(通过授予相关角色或通过直接授予(即,可以在joe上进行授予选择))?该查询的结果还应显示用户通过哪个角色拥有此访问权限,或者它是否是直接授予的权限。


#1 楼

列出已分配了特定角色的所有用户

-- Change 'DBA' to the required role
select * from dba_role_privs where granted_role = 'DBA'


列出分配给用户的所有角色

-- Change 'PHIL@ to the required user
select * from dba_role_privs where grantee = 'PHIL';


列出授予用户的所有特权

select
  lpad(' ', 2*level) || granted_role "User, his roles and privileges"
from
  (
  /* THE USERS */
    select 
      null     grantee, 
      username granted_role
    from 
      dba_users
    where
      username like upper('%&enter_username%')
  /* THE ROLES TO ROLES RELATIONS */ 
  union
    select 
      grantee,
      granted_role
    from
      dba_role_privs
  /* THE ROLES TO PRIVILEGE RELATIONS */ 
  union
    select
      grantee,
      privilege
    from
      dba_sys_privs
  )
start with grantee is null
connect by grantee = prior granted_role;


注意:摘自http://www.adp-gmbh.ch/ora/misc/recursively_list_privilege.html

列出某个角色赋予SELECT访问权限的表?

-- Change 'DBA' to the required role.
select * from role_tab_privs where role='DBA' and privilege = 'SELECT';


列出用户可以从中选择的所有表?

--Change 'PHIL' to the required user
select * from dba_tab_privs where GRANTEE ='PHIL' and privilege = 'SELECT';


列出可以在特定表上进行SELECT的所有用户(通过授予相关角色或通过直接授予(即,可以选择joe进行授予))?该查询的结果还应显示用户通过哪个角色具有此访问权限,或者它是否是直接授予的权限。

-- Change 'TABLENAME' below
select Grantee,'Granted Through Role' as Grant_Type, role, table_name
from role_tab_privs rtp, dba_role_privs drp
where rtp.role = drp.granted_role
and table_name = 'TABLENAME' 
union
select Grantee,'Direct Grant' as Grant_type, null as role, table_name
from dba_tab_privs
where table_name = 'TABLENAME' ;


评论


这是一个好的开始,但是#3不包含对象特权,#5不包括由于角色而可用的SELECT特权,而#6则缺失。

–雷·里菲尔(Leigh Riffel)
2012年3月13日15:17

运算,需要一些CONNECT BY .. PRIOR for#6

–Philᵀᴹ
2012年3月13日15:54

您对#5的答案是否包括用户可以通过分配的角色选择的表?

– dgf
2012年3月15日上午10:06

如果用户从被授予其他角色的角色中获得特权,这是否可行?

– jpmc26
17年8月9日在20:34

#2 楼

有很多方法可以使用所需的信息:


数据字典视图


oracle中存在。

您可以查询视图并检索详细信息:
例如:


从DBA_COL_PRIVS中选择*;从

从ALL_COL_PRIVS中选择*;

从USER_COL_PRIVS中选择*;


这告诉您:


DBA视图描述了数据库中所有列对象的授予。 ALL视图
描述当前用户或
PUBLIC是对象所有者,授予者或被授予者的所有列对象授予。 USER视图描述了
列对象授予,当前用户是该对象的对象所有者,授予者或授予者。


有关更多信息,请查看
/>
希望有帮助。

评论


这似乎没有回答问题:DBA如何找出特定的任意用户可以访问的内容?

–万事通
2014年6月11日下午16:26