Як показати всі привілеї користувача в oracle?


113

Може хтось скажіть мені, як показати всі привілеї / правила конкретного користувача на sql-консолі?

Відповіді:


164

Ви можете спробувати наведені нижче перегляди.

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;

21

Навколо плавають різні сценарії, які будуть робити це залежно від того, наскільки божевільний ви хочете отримати. Я особисто використовував сценарій find_all_privs Піта Фіннігана .

Якщо ви хочете написати це самостійно, запит стає досить складним. Користувачам можуть бути надані системні привілеї, які відображаються в DBA_SYS_PRIVS. Їм можна надати привілеї об'єктів, які видно в DBA_TAB_PRIVS. І їм можуть бути надані ролі, які видно в DBA_ROLE_PRIVS(ролі можуть бути за замовчуванням або не за замовчуванням, а також може знадобитися пароль, тому що лише тому, що користувачеві надано роль, це не означає, що користувач може обов'язково використовувати привілеї, які він набувається через роль за замовчуванням). Але ці ролі можуть, в свою чергу, надається система пільг, привілеїв об'єктів, а також додаткові ролі , які можуть бути переглянуті, дивлячись ROLE_SYS_PRIVS, ROLE_TAB_PRIVSі ROLE_ROLE_PRIVS. Сценарій Піта проходить через ці відносини, щоб показати всі привілеї, які в кінцевому підсумку передаються користувачеві.


Сценарій дивовижний щойно перевірив його
І.Тигер

1
Вам потрібні привілеї до пакету UTL_FILE, інакше ви отримаєте помилку під час запуску сценарію Піта Фіннігана: "ідентифікатор 'UTL_FILE' повинен бути оголошений". Ви можете підключитися як sys до roll sysdba через SQL Developer, і тоді він буде працювати або дозволити собі виконувати привілеї до цього пакету, використовуючи: grant Execute в UTL_FILE до <user>;
Jan

1
А для тих, хто не має SYSпільг і просто хочемо подивитися на привілеї власного облікового запису, сценарій абсолютно марний. Я не маю доступу UTL_FILEні до, ні до DBA_SYS_PRIVSінших DBAта SYSобластей, на які дивиться сценарій.
vapcguy

Я не думаю ROLE_SYS_PRIVS, ROLE_TAB_PRIVSі ROLE_ROLE_PRIVSнеобхідно вивчити. Документи вказують, що вони для поточного користувача.
jpmc26

Якщо хтось має копію цих сценаріїв, чи може він розмістити тут чи десь трохи більше вічнозеленого, як суть? Сайт вниз.
Майкл Томпсон


2

Хоча відповідь 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.

Деякі TODO для себе: 1. Додайте індикатор, якщо користувач може надати привілей, надавши роль іншому користувачеві. 2. З'ясуйте, як це зробити для поточного користувача без привілеїв DBA. Ймовірно, передбачає USER_SYS_PRIVS(безпосередньо надані системні привілеї), USER_TAB_PRIVS(безпосередньо надані об'єкти привілеїв) USER_ROLE_PRIVS(безпосередньо надані користувачеві ролі), ROLE_ROLE_PRIVS(для отримання успадкованих ролей), ROLE_SYS_PRIVS(системні приватні роли через ролі) та ROLE_TAB_PRIVS(об'єкти приватні особи через ролі). Тьфу. Oracle настільки складний.
jpmc26

1

Ви можете використовувати код нижче, щоб отримати весь список привілеїв від усіх користувачів.

select * from dba_sys_privs 

Це не перелічено всіх пільг. Як продемонстровано декілька інших відповідей, які передували вашим роками , він не містить привілеїв таблиці та всіх привілеїв, наданих через ролі.
jpmc26

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.