Bir kullanıcıya alınan TÜM hibeleri nasıl listeleyebilirim?


98

Bir Oracle DB'de tüm hibeleri görmem gerekiyor.

Şemaları karşılaştırmak için TOAD özelliğini kullandım ancak cazip bağışlar vb. Göstermiyor, bu yüzden sorum var:

Bir Oracle DB'deki tüm hibeleri nasıl listeleyebilirim?

Yanıtlar:


142

Doğrudan tablo hibelerinden daha fazlasını istiyorsanız (örneğin, roller aracılığıyla verilen hibe, herhangi bir tabloyu seçme gibi sistem ayrıcalıkları vb.), İşte bazı ek sorgular:

Bir kullanıcı için sistem ayrıcalıkları:

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;

Tablolara / görünümlere doğrudan bağışlar:

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;

Tablolara / görünümlere dolaylı hibeler:

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ınız olmayabilir.
Hannes

1
Kesinlikle doğru. DBA'nızı görün. Reddederlerse, yasal güvenlik endişeleri olabilir. Bu görünümlerin içeriğini görmek, bir kullanıcıya aksi takdirde sahip olamayacakları bilgiler verir.
DCookie

2
role_role_privsMasaya ayrıldıktan sonra CONNECT BY PRIOR granted_role = rolegeçiş rolü ayrıcalıklarına tekrar dönmek ilginç olurdu ...
Lukas Eder

33

Belirli bir kullanıcının aldığı tüm nesnelerle ilgili hibeleri listelemek istediğinizi varsayarsak :

select * from all_tab_privs_recd where grantee = 'your user'

Bu, kullanıcının sahip olduğu nesneleri döndürmez. Bunlara ihtiyacınız varsa, all_tab_privsbunun yerine görünümü kullanın.


20

Üzgünüm çocuklar, ancak Grantee = 'kullanıcınız' olan all_tab_privs_recd arasından seçim yapmak, seçimi farklı bir kullanıcıdan (örneğin SYS) çalıştırırsanız, genel bağışlar ve mevcut kullanıcı izinleri dışında herhangi bir çıktı vermeyecektir. Belgelerin dediği gibi,

ALL_TAB_PRIVS_RECD, aşağıdaki hibe türlerini açıklar:

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

Dolayısıyla, bir DBA iseniz ve belirli bir kullanıcı için (SYS'nin kendisi değil) tüm nesne izinlerini listelemek istiyorsanız, bu sistem görünümünü kullanamazsınız.

Bu durumda, daha karmaşık bir sorgu gerçekleştirmelisiniz. İşte belirli bir kullanıcı için tüm nesne hibelerini seçmek için TOAD'dan alınan (izlenen):

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ınız için tüm nesne izinlerini (sütun izinleri dahil) listeleyecektir. Sütun düzeyinde hibe istemiyorsanız, seçimin 'birleşim' ifadesiyle başlayan tüm parçalarını silin.

UPD: Belgeleri incelerken, tüm hibeleri çok daha basit bir şekilde listeleyen başka bir görünüm buldum:

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

Akılda Ayı var ki hiçbir Oracle'da DBA_TAB_PRIVS_RECD görünümü.


12

Bildiğim en kapsamlı ve güvenilir yöntem hala DBMS_METADATA kullanmak :

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;

Yine de ilginç cevaplar.


5
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')
;

7
Diğer insanlar gelip onu bulduğunda bazı açıklamalar bu cevaba yardımcı olabilir.
Andrew Barber

0

Aşağıdaki sorgu, bir kullanıcının tüm ayrıcalıklarını elde etmek için kullanılabilir .. İlk sorguda kullanıcı adını girmeniz yeterlidir ve bunun için tüm ayrıcalıklara sahip olursunuz.

KULLANICILARLA (dual'den 'SCHEMA_USER' usr'U SEÇİN), Roles AS (dba_role_privs ÜZERİNDEN KULLANICI SEÇİN Rp.GRANTEE = users.usr ÜNİTE SEÇİMİNE VERİLEN UNION SELECT given_role role_role_privs NEREDEN (dba_role_privs'DEN SEÇİN izin verilen_role) Rp ÜZERİNDE KATILIN kullanıcılarla. GRANTEE = users.usr)), tab_privilage AS (SAHİBİ SEÇ, TABLE_NAME, role_tab_privs'DEN ÖZEL, rtp.role = r.granted_role BİRLEŞME SEÇİM SAHİBİ, TABLE_NAME, ÖZEL KULLANICILAR Dba_Tab_Privs dtp ÜZERİNDE KATIL Kullanıcıları dtp. usr), sys_privileges AS (dba_sys_privs'DEN SEÇİN ayrıcalık dsp dsp.grantee = users.usr ÜZERİNDEN kullanıcıları SEÇ) SEÇ * tab_privilage SİPARİŞ Sahibine göre, tablo_adı - sys_privileges'DEN SEÇ *

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.