Відповіді:
Ви можете спробувати наведені нижче перегляди.
SELECT * FROM USER_SYS_PRIVS;
SELECT * FROM USER_TAB_PRIVS;
SELECT * FROM USER_ROLE_PRIVS;
DBA та інші користувачі, що живлять, можуть знайти привілеї, надані іншим користувачам, у DBA_
версіях цих самих поглядів. Вони висвітлюються в документації .
Ці представлення показують лише ті пільги, які надаються безпосередньо користувачеві. Пошук усіх привілеїв, включаючи ті, які надаються опосередковано через ролі, вимагає більш складних рекурсивних SQL-операторів:
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;
Навколо плавають різні сценарії, які будуть робити це залежно від того, наскільки божевільний ви хочете отримати. Я особисто використовував сценарій find_all_privs Піта Фіннігана .
Якщо ви хочете написати це самостійно, запит стає досить складним. Користувачам можуть бути надані системні привілеї, які відображаються в DBA_SYS_PRIVS
. Їм можна надати привілеї об'єктів, які видно в DBA_TAB_PRIVS
. І їм можуть бути надані ролі, які видно в DBA_ROLE_PRIVS
(ролі можуть бути за замовчуванням або не за замовчуванням, а також може знадобитися пароль, тому що лише тому, що користувачеві надано роль, це не означає, що користувач може обов'язково використовувати привілеї, які він набувається через роль за замовчуванням). Але ці ролі можуть, в свою чергу, надається система пільг, привілеїв об'єктів, а також додаткові ролі , які можуть бути переглянуті, дивлячись ROLE_SYS_PRIVS
, ROLE_TAB_PRIVS
і ROLE_ROLE_PRIVS
. Сценарій Піта проходить через ці відносини, щоб показати всі привілеї, які в кінцевому підсумку передаються користувачеві.
SYS
пільг і просто хочемо подивитися на привілеї власного облікового запису, сценарій абсолютно марний. Я не маю доступу UTL_FILE
ні до, ні до DBA_SYS_PRIVS
інших DBA
та SYS
областей, на які дивиться сценарій.
ROLE_SYS_PRIVS
, ROLE_TAB_PRIVS
і ROLE_ROLE_PRIVS
необхідно вивчити. Документи вказують, що вони для поточного користувача.
Ще один корисний ресурс:
http://psoug.org/reference/roles.html
DBA
або SYS
ролі, і ви просто хочете знайти привілеї свого аккаунта.
Хоча відповідь Raviteja Vutukuri працює і швидко збирається, вона не особливо гнучка для зміни фільтрів і не дуже допомагає, якщо ви хочете зробити щось програмно. Тому я зібрав власний запит:
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
;
Переваги:
WHERE
застереження.DBMS_OUTPUT
чи щось (порівняно із пов'язаним сценарієм Піта Фіннігана). Це робить його корисним для програмного використання та для експорту.GRANT
.USER_SYS_PRIVS
(безпосередньо надані системні привілеї), USER_TAB_PRIVS
(безпосередньо надані об'єкти привілеїв) USER_ROLE_PRIVS
(безпосередньо надані користувачеві ролі), ROLE_ROLE_PRIVS
(для отримання успадкованих ролей), ROLE_SYS_PRIVS
(системні приватні роли через ролі) та ROLE_TAB_PRIVS
(об'єкти приватні особи через ролі). Тьфу. Oracle настільки складний.
Ви можете використовувати код нижче, щоб отримати весь список привілеїв від усіх користувачів.
select * from dba_sys_privs
Щоб показати всі привілеї:
виберіть ім'я з system_privilege_map;