Jawaban:
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;
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_PRIVS
dan ROLE_ROLE_PRIVS
. Skrip Pete menelusuri hubungan tersebut untuk menunjukkan semua hak istimewa yang akhirnya mengalir ke pengguna.
SYS
hak istimewa dan hanya ingin melihat keistimewaan akun kita sendiri, skrip ini sama sekali tidak berharga. Saya tidak memiliki akses ke UTL_FILE
atau untuk DBA_SYS_PRIVS
dan lainnya DBA
dan SYS
daerah script terlihat di.
ROLE_SYS_PRIVS
, ROLE_TAB_PRIVS
dan ROLE_ROLE_PRIVS
kebutuhan untuk diperiksa. Dokumen menunjukkan bahwa mereka untuk pengguna saat ini .
Sumber daya berguna lainnya:
http://psoug.org/reference/roles.html
DBA
atau SYS
, dan Anda hanya ingin mencari hak istimewa akun Anda sendiri.
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:
WHERE
klausa itu.DBMS_OUTPUT
atau sesuatu (dibandingkan dengan skrip terkait Pete Finnigan). Ini membuatnya berguna untuk penggunaan terprogram dan untuk mengekspor.GRANT
.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.
Anda dapat menggunakan kode di bawah ini untuk mendapatkan semua daftar hak istimewa dari semua pengguna.
select * from dba_sys_privs
Untuk menampilkan semua hak istimewa:
pilih nama dari system_privilege_map;