Jawaban:
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;
role_role_privs
tabel dan kemudian kembali CONNECT BY PRIOR granted_role = role
ke hak istimewa peran transitif ...
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_privs
tampilan sebagai gantinya.
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.
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.
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')
;
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