Bagaimana cara mencantumkan SEMUA hibah yang diterima pengguna?

97

Saya perlu melihat semua hibah di Oracle DB.

Saya menggunakan fitur TOAD untuk membandingkan skema tetapi tidak menunjukkan hibah tabel waktu dll. Jadi ada pertanyaan saya:

Bagaimana cara mencantumkan semua hibah di Oracle DB?

guerda
sumber

Jawaban:

141

Jika Anda menginginkan lebih dari sekadar pemberian tabel langsung (misalnya, hibah melalui peran, hak istimewa sistem seperti memilih tabel apa pun, dll.), Berikut adalah beberapa kueri tambahan:

Hak istimewa sistem untuk pengguna:

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;

Hibah langsung ke tabel / tampilan:

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;

Hibah tidak langsung ke tabel / tampilan:

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;
DCookie
sumber
1
Anda mungkin tidak berhak melihat tabel sys.dba_sys_privs.
Hannes
1
Tepat sekali. Lihat DBA Anda. Jika mereka menolak, mereka mungkin memiliki masalah keamanan yang sah. Melihat konten tampilan ini memberikan informasi kepada pengguna yang tidak dapat mereka peroleh sebaliknya.
DCookie
2
Menarik untuk dibiarkan bergabung dengan role_role_privstabel dan kemudian kembali CONNECT BY PRIOR granted_role = roleke hak istimewa peran transitif ...
Lukas Eder
33

Dengan asumsi Anda ingin membuat daftar hibah pada semua objek yang telah diterima pengguna tertentu :

select * from all_tab_privs_recd where grantee = 'your user'

Ini tidak akan mengembalikan objek yang dimiliki oleh pengguna. Jika Anda membutuhkannya, gunakan all_tab_privstampilan sebagai gantinya.

Juris
sumber
20

Maaf teman-teman, tetapi memilih dari all_tab_privs_recd di mana grantee = 'your user' tidak akan memberikan keluaran apa pun kecuali hibah publik dan hibah pengguna saat ini jika Anda menjalankan pemilihan dari pengguna yang berbeda (katakanlah, SYS). Seperti yang dikatakan dokumentasi,

ALL_TAB_PRIVS_RECD menjelaskan jenis hibah berikut:

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

Jadi, jika Anda seorang DBA dan ingin mencantumkan semua pemberian objek untuk pengguna tertentu (bukan SYS itu sendiri), Anda tidak dapat menggunakan tampilan sistem itu.

Dalam kasus ini, Anda harus melakukan kueri yang lebih kompleks. Ini adalah salah satu yang diambil (dilacak) dari TOAD untuk memilih semua objek yang diberikan untuk pengguna tertentu:

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;

Ini akan mencantumkan semua hibah objek (termasuk hibah kolom) untuk pengguna (yang ditentukan) Anda. Jika Anda tidak ingin hibah tingkat kolom, hapus semua bagian dari pemilihan yang dimulai dengan klausa 'union'.

UPD: Mempelajari dokumentasi, saya menemukan tampilan lain yang mencantumkan semua hibah dengan cara yang lebih sederhana:

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

Ingatlah bahwa tidak ada tampilan DBA_TAB_PRIVS_RECD di Oracle.

Alex Cherkas
sumber
12

Metode paling komprehensif dan andal yang saya tahu masih menggunakan DBMS_METADATA :

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;

Jawaban yang menarik sekalipun.

Matteo Steccolini
sumber
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')
;
Sujit
sumber
7
Beberapa penjelasan akan membantu jawaban ini, karena ketika orang lain datang dan menemukannya.
Andrew Barber
0

Kueri berikut dapat digunakan untuk mendapatkan semua hak istimewa dari satu pengguna .. Cukup berikan nama pengguna di kueri pertama dan Anda akan mendapatkan semua hak istimewa untuk itu

DENGAN pengguna AS (PILIH 'SCHEMA_USER' usr DARI dual), Peran AS (PILIH given_role FROM dba_role_privs rp GABUNG pengguna ON rp.GRANTEE = users.usr UNION SELECT given_role FROM role_role_privs WHERE role IN (PILIH given_role FROM dba_role_privs rp JOIN users ON rp GABUNG. GRANTEE = users.usr)), tab_privilage AS (SELECT OWNER, TABLE_NAME, PRIVILEGE FROM role_tab_privs rtp GABUNG peran r ON rtp.role = r.granted_role UNION SELECT OWNER, TABLE_NAME, PRIVILEGE FROM role_tab_privs rtp GABUNG peran r ON rtp.role = r.granted_role UNION SELECT OWNER, TABLE_NAME, PRIVILEGE Pengguna ON = pengguna Dba_Tab_POvs dtpt Jp.grantee dtp. usr), sys_privileges AS (PILIH hak istimewa DARI dba_sys_privs dsp GABUNG pengguna DI dsp.grantee = users.usr) SELECT * FROM tab_privilage ORDER BY owner, table_name --SELECT * FROM sys_privileges

Pradeep Dewani
sumber