2011-05-13 6 views
2

오라클 일반 (DBA가 아닌) 사용자에게 권한이있는 사용자가 소유하지 않은 개체와 권한 부여 방법 (역할 또는 직접 부여를 통해)을 찾아야합니다.오라클 권한

간단한 스크립트를 작성할 수 있습니까?

답변

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; 

편집 :이 PL/SQL 실행뿐만 아니라 개체를 포함로

는 ALL_TAB_PRIVS는 잘못된 이름의 비트입니다.

편집 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

+0

쿼리를 실행하고 역할 이름을 : usercheck로 사용해보십시오. 이것은 dba * 테이블을 사용하는 스크립트의 수정입니다. 제한된 사용자의 경우 dba _ * _ privs 테이블/뷰와 같이 볼 수있는 것에 제한을받습니다. –