2011-05-13 46 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