Как показать все привилегии от пользователя в Oracle? - PullRequest
101 голосов
/ 21 марта 2012

Может кто-нибудь подсказать, как показать все привилегии / правила от конкретного пользователя в sql-консоли?

Ответы [ 6 ]

147 голосов
/ 21 марта 2012

Вы можете попробовать эти представленные ниже представления.

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

Администраторы баз данных и другие опытные пользователи могут найти привилегии, предоставленные другим пользователям с 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;
18 голосов
/ 22 марта 2012

Существуют различные скрипты, которые делают это в зависимости от того, насколько сумасшедшим вы хотите стать.Я бы лично использовал сценарий Пита Финнигана find_all_privs .

Если вы хотите написать это самостоятельно, запрос становится довольно сложным.Пользователям могут быть предоставлены системные привилегии, которые отображаются в DBA_SYS_PRIVS.Им могут быть предоставлены объектные привилегии, которые видны в DBA_TAB_PRIVS.И им могут быть предоставлены роли, которые видны в DBA_ROLE_PRIVS (роли могут быть по умолчанию или не по умолчанию, а также могут требовать пароль, так что только то, что пользователю была предоставлена ​​роль, не означает, что пользователь может обязательно использоватьпривилегии, которые он получил через роль по умолчанию).Но этим ролям, в свою очередь, могут быть предоставлены системные привилегии, объектные привилегии и дополнительные роли, которые можно просмотреть, просмотрев ROLE_SYS_PRIVS, ROLE_TAB_PRIVS и ROLE_ROLE_PRIVS.Скрипт Пита просматривает эти отношения, чтобы показать все привилегии, которые в итоге передаются пользователю.

7 голосов
/ 03 февраля 2014

Другой полезный ресурс:

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

  • DBA_SYS_PRIVS
  • DBA_TAB_PRIVS
  • DBA_ROLE_PRIVS
1 голос
/ 20 июня 2017

Вы можете использовать приведенный ниже код, чтобы получить список всех привилегий от всех пользователей.

select * from dba_sys_privs 
0 голосов
/ 18 марта 2019

Чтобы показать все привилегии:

выберите имя из system_privilege_map;

0 голосов
/ 13 июля 2018

Хотя Ответ Равитея Вутукури работает и быстро собирается, он не особенно гибок для изменения фильтров и не слишком помогает, если вы хотите что-то сделать программно.Поэтому я собрал свой собственный запрос:

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.
...