2009-08-19 21 views

cevap

99

sadece doğrudan tablo hibe daha fazlasını isterseniz (örneğin roller aracılığıyla hibe, vb herhangi bir tabloyu seçmek gibi sistem ayrıcalıkları), burada bazı ek sorgusu: Bir kullanıcı için

Sistem ayrıcalıkları:

tablolar/görünümlere
SELECT PRIVILEGE 
    FROM sys.dba_sys_privs 
WHERE grantee = <theUser> 
UNION 
SELECT PRIVILEGE 
    FROM dba_role_privs rp JOIN role_sys_privs rsp ON (rp.granted_role = rsp.role) 
WHERE rp.grantee = <theUser> 
ORDER BY 1; 

Doğrudan hibe: tablolar/görünümlere

SELECT owner, table_name, select_priv, insert_priv, delete_priv, update_priv, references_priv, alter_priv, index_priv 
    FROM table_privileges 
WHERE grantee = <theUser> 
ORDER BY owner, table_name; 

Dolaylı hibe:

Eğer kullanıcı (SYS diyelim) Farklı bir seçin çalıştırırsanız Bursiyer = 'Kullanıcı' kamu hibe ve geçerli kullanıcı hibe haricinde herhangi bir çıktı vermeyecektir
SELECT DISTINCT owner, table_name, PRIVILEGE 
    FROM dba_role_privs rp JOIN role_tab_privs rtp ON (rp.granted_role = rtp.role) 
WHERE rp.grantee = <theUser> 
ORDER BY owner, table_name; 
+1

sys.dba_sys_privs tablosunu görme hakkına sahip değilsiniz. – Hannes

+1

Kesinlikle doğru. DBA'nızı görün. Reddederlerse yasal güvenlik sorunları olabilir. Bu görüntülerin içeriğinin görülmesi, aksi takdirde sahip olamayacakları bir kullanıcı bilgisi verir. – DCookie

+2

“role_role_privs” tablosuna katılmaya ve sonra “CONNECT BY PRIOR WITH granted_role = role” 'ye geçiş rollerine geçiş yapmak ilginç olurdu ... –

27

Eğer belirli bir kullanıcı aldığı tüm nesneler üzerinde hibe listelemek istediğiniz varsayarsak: Bu kullanıcının sahip olduğu nesneler döndürmez

select * from all_tab_privs_recd where grantee = 'your user' 

. Bunlara ihtiyacınız varsa, bunun yerine all_tab_privs görünümünü kullanın.

4
select distinct 'GRANT '||privilege||' ON '||OWNER||'.'||TABLE_NAME||' TO '||RP.GRANTEE 
from DBA_ROLE_PRIVS RP join ROLE_TAB_PRIVS RTP 
on (RP.GRANTED_ROLE = RTP.role) 
where (OWNER in ('YOUR USER') --Change User Name 
    OR RP.GRANTEE in ('YOUR USER')) --Change User Name 
and RP.GRANTEE not in ('SYS', 'SYSTEM') 
; 
+5

Bazı açıklamalar bu soruya yardımcı olur, çünkü diğer insanlar gelip bulduklarında. –

12

Üzgünüm çocuklar ama all_tab_privs_recd seçerek . dokümantasyon söylediği gibi

ALL_TAB_PRIVS_RECD hibe aşağıdaki türleri açıklanmaktadır:

Object grants for which the current user is the grantee 
Object grants for which an enabled role or PUBLIC is the grantee 

Yani, bir DBA konum ve belirli (değil SYS için tüm nesneyi hibe listelemek istiyorsanız kendisi) kullanıcı, bu sistem görünümünü kullanamazsınız.

Bu durumda, daha karmaşık bir sorgulama gerçekleştirmelisiniz. İşte bir belirli bir kullanıcı için tüm nesne hibe seçmek için TOAD alınan (takip) olduğu:

select tpm.name privilege, 
     decode(mod(oa.option$,2), 1, 'YES', 'NO') grantable, 
     ue.name grantee, 
     ur.name grantor, 
     u.name owner, 
     decode(o.TYPE#, 0, 'NEXT OBJECT', 1, 'INDEX', 2, 'TABLE', 3, 'CLUSTER', 
         4, 'VIEW', 5, 'SYNONYM', 6, 'SEQUENCE', 
         7, 'PROCEDURE', 8, 'FUNCTION', 9, 'PACKAGE', 
         11, 'PACKAGE BODY', 12, 'TRIGGER', 
         13, 'TYPE', 14, 'TYPE BODY', 
         19, 'TABLE PARTITION', 20, 'INDEX PARTITION', 21, 'LOB', 
         22, 'LIBRARY', 23, 'DIRECTORY', 24, 'QUEUE', 
         28, 'JAVA SOURCE', 29, 'JAVA CLASS', 30, 'JAVA RESOURCE', 
         32, 'INDEXTYPE', 33, 'OPERATOR', 
         34, 'TABLE SUBPARTITION', 35, 'INDEX SUBPARTITION', 
         40, 'LOB PARTITION', 41, 'LOB SUBPARTITION', 
         42, 'MATERIALIZED VIEW', 
         43, 'DIMENSION', 
         44, 'CONTEXT', 46, 'RULE SET', 47, 'RESOURCE PLAN', 
         66, 'JOB', 67, 'PROGRAM', 74, 'SCHEDULE', 
         48, 'CONSUMER GROUP', 
         51, 'SUBSCRIPTION', 52, 'LOCATION', 
         55, 'XML SCHEMA', 56, 'JAVA DATA', 
         57, 'EDITION', 59, 'RULE', 
         62, 'EVALUATION CONTEXT', 
         'UNDEFINED') object_type, 
     o.name object_name, 
     '' column_name 
     from sys.objauth$ oa, sys.obj$ o, sys.user$ u, sys.user$ ur, sys.user$ ue, 
      table_privilege_map tpm 
     where oa.obj# = o.obj# 
      and oa.grantor# = ur.user# 
      and oa.grantee# = ue.user# 
      and oa.col# is null 
      and oa.privilege# = tpm.privilege 
      and u.user# = o.owner# 
      and o.TYPE# in (2, 4, 6, 9, 7, 8, 42, 23, 22, 13, 33, 32, 66, 67, 74, 57) 
    and ue.name = 'your user' 
    and bitand (o.flags, 128) = 0 
union all -- column level grants 
select tpm.name privilege, 
     decode(mod(oa.option$,2), 1, 'YES', 'NO') grantable, 
     ue.name grantee, 
     ur.name grantor, 
     u.name owner, 
     decode(o.TYPE#, 2, 'TABLE', 4, 'VIEW', 42, 'MATERIALIZED VIEW') object_type, 
     o.name object_name, 
     c.name column_name 
from sys.objauth$ oa, sys.obj$ o, sys.user$ u, sys.user$ ur, sys.user$ ue, 
    sys.col$ c, table_privilege_map tpm 
where oa.obj# = o.obj# 
    and oa.grantor# = ur.user# 
    and oa.grantee# = ue.user# 
    and oa.obj# = c.obj# 
    and oa.col# = c.col# 
    and bitand(c.property, 32) = 0 /* not hidden column */ 
    and oa.col# is not null 
    and oa.privilege# = tpm.privilege 
    and u.user# = o.owner# 
    and o.TYPE# in (2, 4, 42) 
    and ue.name = 'your user' 
    and bitand (o.flags, 128) = 0; 

Bu (belirtilen) kullanıcı için (sütun hibeler dahil) tüm nesne hibe listeler. Sütun düzeyinde bağışlar istemiyorsanız, seçim başlangıcındaki tüm kısımları 'union' yan tümcesiyle silin.

UPD: Oracle hiçbir DBA_TAB_PRIVS_RECD görünümü var olduğunu akılda

select * from DBA_TAB_PRIVS where grantee = 'your user'; 

Ayı: Ben çok daha basit bir şekilde tüm hibe listeler başka bir görünüm bulunan belgelerin incelenmesi.

7

bildiğim en kapsamlı ve güvenilir bir yöntem DBMS_METADATA kullanarak hala: gerçi

select dbms_metadata.get_granted_ddl('SYSTEM_GRANT', :username) from dual; 
select dbms_metadata.get_granted_ddl('OBJECT_GRANT', :username) from dual; 
select dbms_metadata.get_granted_ddl('ROLE_GRANT', :username) from dual; 

İlginç cevapları.

İlgili konular