Как показать все привилегии пользователя в Oracle?

113

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

судьба
источник

Ответы:

164

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

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;
Teja
источник
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, и тогда он будет работать или предоставить себе привилегии выполнения для этого пакета, используя: предоставить выполнение на UTL_FILE <пользователю>;
янв.
1
А для тех из нас, у кого нет SYSпривилегий, и кто просто хочет посмотреть на привилегии своей учетной записи, сценарий совершенно бесполезен. У меня нет доступа к UTL_FILEни к , DBA_SYS_PRIVSа другой DBAи SYSплощади выглядит скрипт в.
vapcguy
Я не думаю ROLE_SYS_PRIVS, ROLE_TAB_PRIVSи ROLE_ROLE_PRIVSнужно исследовать. В документации указано, что они предназначены для текущего пользователя.
jpmc26
Если у кого-нибудь есть копии этих скриптов, могут ли они опубликовать здесь или где-нибудь более вечнозеленые, как суть? Сайт не работает.
Майкл Томпсон,
7

Еще один полезный ресурс:

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

  • dba_sys_privs
  • DBA_TAB_PRIVS
  • DBA_ROLE_PRIVS
Ageu
источник
2
За исключением случаев, когда у вас нет ролей DBAили SYS, и вы просто хотите получить привилегии своей учетной записи.
vapcguy
2

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

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.
jpmc26
источник
Некоторые TODO для меня: 1. Добавьте индикатор, может ли пользователь предоставить привилегию, назначив роль другому пользователю. 2. Выясните, как это сделать для текущего пользователя без прав администратора базы данных. Вероятно, включает 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
-1

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

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

Ербол Байгараев
источник