2011-05-13 77 views
2

给定一个Oracle正常(而不是DBA)用户,我需要找出哪些对象不属于他拥有权限的用户以及它是如何被授予的(通过什么角色或直接授予)。Oracle权限

你能写一个简单的脚本吗?

回答

2

我认为这应该让你几乎所需。 ALL_TAB_PRIVS可用于数据库中的所有用户,并列出执行SELECT的用户拥有权限的所有对象,权限是什么以及授予谁的权限。我已将它加入到另一个视图ROLE_TAB_PRIVS中,以查找授予用户特权的角色(如果有的话)。如果用户通过角色和直接授权获得了权限,则列出这两个权限。

SELECT atp.grantor, atp.privilege, 
     CASE WHEN NVL(rtp.role,'NULL') <> atp.grantee THEN atp.grantee 
      ELSE atp.grantee||' (ROLE)' 
     END grantee, atp.table_name 
    FROM all_tab_privs atp LEFT JOIN role_tab_privs rtp 
         ON (atp.table_name = rtp.table_name AND 
          atp.table_schema = rtp.owner) 
WHERE grantor <> 'SYS' /* Optional - filter out SYS owned objects */ 
UNION ALL 
SELECT owner, 'SELECT' /* Assume SELECT */, NULL, view_name||' (VIEW)' 
    FROM all_views 
WHERE owner <> 'SYS' /* Optional - filter out SYS owned views */ 
ORDER BY 1,3; 

编辑:

ALL_TAB_PRIVS是有点用词不当,因为它包括PL/SQL可执行对象以及。

编辑2:

看来,这留下了意见。您可以将all_views结果与上述查询结合起来,以提供您有权访问的所有视图,但我现在还不确定如何向您提供授予视图的确切权限。

一句警告:包括您有权访问的所有SYS对象会给您一个相当庞大的列表。您可能希望过滤掉属于SYS的对象,如我在此处所示。

0

这应该让你想要你想要的,但只适用于该用户。

select username 
, 'ROL' type 
, granted_role pv 
from user_role_privs 
union 
select username 
, 'PRV' type 
, privilege pv 
from user_sys_privs 
union 
select grantee as username 
, 'OBJ' type, 
regexp_replace(max(decode(privilege,'WRITE','WRITE,'))|| 
max(decode(privilege,'READ','READ,'))|| 
max(decode(privilege,'EXECUTE','EXECUTE')),'WRITE,READ,EXECUTE','ALL')|| 
regexp_replace(max(decode(privilege,'SELECT','SELECT'))|| 
max(decode(privilege,'DELETE',',DELETE'))|| 
max(decode(privilege,'UPDATE',',UPDATE'))|| 
max(decode(privilege,'INSERT',',INSERT')),'SELECT,DELETE,UPDATE,INSERT','ALL')|| 
' ON '||object_type||' "'||a.owner||'"."'||table_name||'"' pv 
from user_tab_privs a 
    , all_objects b 
where a.table_name = b.object_name 
and a.owner=b.owner 
group by a.owner 
, table_name 
, object_type 
, grantee 
union 
select grantee AS username 
, 'COL' type, 
privilege||' ('||column_name||') ON "'||owner||'"."'||table_name||'"' pv 
from user_col_privs 
where grantee=:usercheck 
order by 1 
, type 
, pv; 
+0

这似乎没有显示我已通过角色授予访问权限的对象,只显示了我被授予访问权限的角色。 – DCookie 2011-05-13 18:18:31

+0

尝试运行查询并使用角色名称作为:usercheck。这是我使用dba *表的一个脚本的修改。对于有限的用户,您受限于您可以看到的内容,如dba _ * _ privs tables/views。 – 2011-05-13 21:40:06