Как показать все привилегии от пользователя в oracle?
может кто-нибудь подскажет как показать все привилегии/правила от конкретного пользователя в sql-консоли?
5 ответов:
вы можете попробовать следующие ниже виды.
SELECT * FROM USER_SYS_PRIVS; SELECT * FROM USER_TAB_PRIVS; SELECT * FROM USER_ROLE_PRIVS;
DBAs и другие опытные пользователи могут найти привилегии, предоставленные другим пользователям с помощью
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
. Сценарий Пита проходит через эти отношения, чтобы показать все привилегии, которые в конечном итоге передаются пользователю.
еще один полезный ресурс:
http://psoug.org/reference/roles.html
- DBA_SYS_PRIVS
- DBA_TAB_PRIVS
- DBA_ROLE_PRIVS
вы можете использовать ниже код, чтобы получить весь список привилегий всех пользователей.
select * from dba_sys_privs
пока ответ Равитеджи Вутукури работает и быстро складывается, он не особенно гибок для изменения фильтров и не слишком помогает, если вы хотите сделать что-то программно. Поэтому я собрал свой собственный запрос:
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
.