Bagaimana cara menampilkan semua hak istimewa dari pengguna di oracle?

113

Dapatkah seseorang memberi tahu saya cara menampilkan semua hak istimewa / aturan dari pengguna tertentu di konsol-sql?

takdir
sumber

Jawaban:

164

Anda dapat mencoba tampilan di bawah ini.

SELECT * FROM USER_SYS_PRIVS; 
SELECT * FROM USER_TAB_PRIVS;
SELECT * FROM USER_ROLE_PRIVS;

DBA dan power user lainnya dapat menemukan hak istimewa yang diberikan kepada pengguna lain dengan DBA_versi tampilan yang sama ini. Mereka tercakup dalam dokumentasi .

Tampilan tersebut hanya menunjukkan hak istimewa yang diberikan langsung kepada pengguna. Menemukan semua hak istimewa, termasuk yang diberikan secara tidak langsung melalui peran, membutuhkan pernyataan SQL rekursif yang lebih rumit:

select * from dba_role_privs connect by prior granted_role = grantee start with grantee = '&USER' order by 1,2,3;
select * from dba_sys_privs  where grantee = '&USER' or grantee in (select granted_role from dba_role_privs connect by prior granted_role = grantee start with grantee = '&USER') order by 1,2,3;
select * from dba_tab_privs  where grantee = '&USER' or grantee in (select granted_role from dba_role_privs connect by prior granted_role = grantee start with grantee = '&USER') order by 1,2,3,4;
Teja
sumber
21

Ada berbagai skrip yang beredar yang akan melakukan itu tergantung pada seberapa gila Anda ingin mendapatkannya. Saya pribadi akan menggunakan skrip find_all_privs Pete Finnigan .

Jika Anda ingin menulisnya sendiri, kueri akan menjadi agak menantang. Pengguna dapat diberikan hak istimewa sistem yang terlihat di DBA_SYS_PRIVS. Mereka dapat diberikan hak istimewa objek yang terlihat di DBA_TAB_PRIVS. Dan mereka dapat diberikan peran yang terlihat di DBA_ROLE_PRIVS(peran dapat default atau non-default dan dapat memerlukan sandi juga, jadi hanya karena pengguna telah diberikan peran tidak berarti bahwa pengguna dapat menggunakan hak istimewa yang dia miliki. diperoleh melalui peran secara default). Tapi peran-peran dapat, pada gilirannya, menjadi hak istimewa yang diberikan sistem, hak istimewa objek, dan peran tambahan yang dapat dilihat dengan melihat ROLE_SYS_PRIVS, ROLE_TAB_PRIVSdan ROLE_ROLE_PRIVS. Skrip Pete menelusuri hubungan tersebut untuk menunjukkan semua hak istimewa yang akhirnya mengalir ke pengguna.

Gua Justin
sumber
Skripnya luar biasa baru saja memeriksanya
I.Tyger
1
Anda memerlukan hak istimewa untuk paket UTL_FILE atau Anda akan mendapatkan kesalahan saat menjalankan skrip Pete Finnigan: "pengenal 'UTL_FILE' harus dideklarasikan". Anda dapat terhubung sebagai sys dengan roll sysdba melalui SQL Developer dan kemudian akan bekerja atau memberikan Anda hak untuk mengeksekusi paket ini menggunakan: grant execute on UTL_FILE to <user>;
Januari
1
Dan bagi kita yang tidak memiliki SYShak istimewa dan hanya ingin melihat keistimewaan akun kita sendiri, skrip ini sama sekali tidak berharga. Saya tidak memiliki akses ke UTL_FILEatau untuk DBA_SYS_PRIVSdan lainnya DBAdan SYSdaerah script terlihat di.
vapcguy
Saya tidak berpikir ROLE_SYS_PRIVS, ROLE_TAB_PRIVSdan ROLE_ROLE_PRIVSkebutuhan untuk diperiksa. Dokumen menunjukkan bahwa mereka untuk pengguna saat ini .
jpmc26
Jika ada yang memiliki salinan skrip ini, dapatkah mereka memposting di sini atau di tempat yang lebih hijau seperti intinya? Situs sedang down.
Michael Thompson
7

Sumber daya berguna lainnya:

http://psoug.org/reference/roles.html

  • DBA_SYS_PRIVS
  • DBA_TAB_PRIVS
  • DBA_ROLE_PRIVS
Ageu
sumber
2
Kecuali jika Anda tidak memiliki peran DBAatau SYS, dan Anda hanya ingin mencari hak istimewa akun Anda sendiri.
vapcguy
2

Meskipun jawaban Raviteja Vutukuri berfungsi dan cepat disatukan, itu tidak terlalu fleksibel untuk memvariasikan filter dan tidak terlalu membantu jika Anda ingin melakukan sesuatu secara terprogram. Jadi saya mengumpulkan kueri saya sendiri:

SELECT
    PRIVILEGE,
    OBJ_OWNER,
    OBJ_NAME,
    USERNAME,
    LISTAGG(GRANT_TARGET, ',') WITHIN GROUP (ORDER BY GRANT_TARGET) AS GRANT_SOURCES, -- Lists the sources of the permission
    MAX(ADMIN_OR_GRANT_OPT) AS ADMIN_OR_GRANT_OPT, -- MAX acts as a Boolean OR by picking 'YES' over 'NO'
    MAX(HIERARCHY_OPT) AS HIERARCHY_OPT -- MAX acts as a Boolean OR by picking 'YES' over 'NO'
FROM (
    -- Gets all roles a user has, even inherited ones
    WITH ALL_ROLES_FOR_USER AS (
        SELECT DISTINCT CONNECT_BY_ROOT GRANTEE AS GRANTED_USER, GRANTED_ROLE
        FROM DBA_ROLE_PRIVS
        CONNECT BY GRANTEE = PRIOR GRANTED_ROLE
    )
    SELECT
        PRIVILEGE,
        OBJ_OWNER,
        OBJ_NAME,
        USERNAME,
        REPLACE(GRANT_TARGET, USERNAME, 'Direct to user') AS GRANT_TARGET,
        ADMIN_OR_GRANT_OPT,
        HIERARCHY_OPT
    FROM (
        -- System privileges granted directly to users
        SELECT PRIVILEGE, NULL AS OBJ_OWNER, NULL AS OBJ_NAME, GRANTEE AS USERNAME, GRANTEE AS GRANT_TARGET, ADMIN_OPTION AS ADMIN_OR_GRANT_OPT, NULL AS HIERARCHY_OPT
        FROM DBA_SYS_PRIVS
        WHERE GRANTEE IN (SELECT USERNAME FROM DBA_USERS)
        UNION ALL
        -- System privileges granted users through roles
        SELECT PRIVILEGE, NULL AS OBJ_OWNER, NULL AS OBJ_NAME, ALL_ROLES_FOR_USER.GRANTED_USER AS USERNAME, GRANTEE AS GRANT_TARGET, ADMIN_OPTION AS ADMIN_OR_GRANT_OPT, NULL AS HIERARCHY_OPT
        FROM DBA_SYS_PRIVS
        JOIN ALL_ROLES_FOR_USER ON ALL_ROLES_FOR_USER.GRANTED_ROLE = DBA_SYS_PRIVS.GRANTEE
        UNION ALL
        -- Object privileges granted directly to users
        SELECT PRIVILEGE, OWNER AS OBJ_OWNER, TABLE_NAME AS OBJ_NAME, GRANTEE AS USERNAME, GRANTEE AS GRANT_TARGET, GRANTABLE, HIERARCHY
        FROM DBA_TAB_PRIVS
        WHERE GRANTEE IN (SELECT USERNAME FROM DBA_USERS)
        UNION ALL
        -- Object privileges granted users through roles
        SELECT PRIVILEGE, OWNER AS OBJ_OWNER, TABLE_NAME AS OBJ_NAME, GRANTEE AS USERNAME, ALL_ROLES_FOR_USER.GRANTED_ROLE AS GRANT_TARGET, GRANTABLE, HIERARCHY
        FROM DBA_TAB_PRIVS
        JOIN ALL_ROLES_FOR_USER ON ALL_ROLES_FOR_USER.GRANTED_ROLE = DBA_TAB_PRIVS.GRANTEE
    ) ALL_USER_PRIVS
    -- Adjust your filter here
    WHERE USERNAME = 'USER_NAME'
) DISTINCT_USER_PRIVS
GROUP BY
    PRIVILEGE,
    OBJ_OWNER,
    OBJ_NAME,
    USERNAME
;

Keuntungan:

  • Saya dengan mudah dapat memfilter dengan banyak potongan informasi yang berbeda, seperti objek, hak istimewa, apakah itu melalui peran tertentu, dll hanya dengan mengubah satu WHEREklausa itu.
  • Ini adalah kueri tunggal, artinya saya tidak perlu menyusun hasil secara mental bersama-sama.
  • Ini menyelesaikan masalah apakah mereka dapat memberikan hak istimewa atau tidak dan apakah itu termasuk hak istimewa untuk subobjek (bagian "hierarki") di berbagai sumber hak istimewa.
  • Sangat mudah untuk melihat semua yang perlu saya lakukan untuk mencabut hak istimewa, karena daftar semua sumber hak istimewa.
  • Ini menggabungkan hak istimewa tabel dan sistem menjadi satu tampilan yang koheren, memungkinkan kami untuk membuat daftar semua hak istimewa pengguna dalam satu gerakan.
  • Ini adalah kueri , bukan fungsi yang memuntahkan semua ini DBMS_OUTPUTatau sesuatu (dibandingkan dengan skrip terkait Pete Finnigan). Ini membuatnya berguna untuk penggunaan terprogram dan untuk mengekspor.
  • Filter tidak diulang; itu hanya muncul sekali. Ini membuatnya lebih mudah untuk berubah.
  • Subkueri dapat dengan mudah ditarik jika Anda perlu memeriksanya oleh setiap individu GRANT.
jpmc26.dll
sumber
Beberapa TODO untuk saya sendiri: 1. Tambahkan indikator jika pengguna dapat memberikan hak istimewa dengan memberikan peran kepada pengguna lain. 2. Cari tahu bagaimana melakukan ini untuk pengguna saat ini tanpa hak istimewa DBA. Mungkin melibatkan USER_SYS_PRIVS(hak istimewa sistem yang diberikan secara langsung), USER_TAB_PRIVS(hak pribadi objek yang diberikan secara langsung) USER_ROLE_PRIVS(peran yang diberikan langsung oleh pengguna), ROLE_ROLE_PRIVS(untuk mendapatkan peran yang diwariskan), ROLE_SYS_PRIVS(privasi sistem melalui peran) dan ROLE_TAB_PRIVS(privasi objek melalui peran). Ugh. Oracle sangat rumit.
jpmc26
1

Anda dapat menggunakan kode di bawah ini untuk mendapatkan semua daftar hak istimewa dari semua pengguna.

select * from dba_sys_privs 
Ravi Bhushan
sumber
Ini tidak mencantumkan semua hak istimewa. Seperti yang ditunjukkan oleh beberapa jawaban lain yang mendahului Anda dengan bertahun-tahun , ini menghilangkan hak istimewa tabel dan semua hak istimewa yang diberikan melalui peran.
jpmc26
-1

Untuk menampilkan semua hak istimewa:

pilih nama dari system_privilege_map;

Yerbol Baigarayev
sumber