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?
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 kembaliCONNECT 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 :
Ini tidak akan mengembalikan objek yang dimiliki oleh pengguna. Jika Anda membutuhkannya, gunakan
all_tab_privs
tampilan sebagai gantinya.sumber
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,
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:
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:
Ingatlah bahwa tidak ada tampilan DBA_TAB_PRIVS_RECD di Oracle.
sumber
Metode paling komprehensif dan andal yang saya tahu masih menggunakan DBMS_METADATA :
Jawaban yang menarik sekalipun.
sumber
sumber
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
sumber