Ответы:
Вы можете попробовать эти виды ниже.
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;
Существуют различные сценарии, которые будут делать это в зависимости от того, насколько сумасшедшим вы хотите стать. Я бы лично использовал скрипт 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
, и вы просто хотите получить привилегии своей учетной записи.
Хотя ответ Равитеи Вутукури работает и его можно быстро собрать, он не особенно гибкий для изменения фильтров и не очень помогает, если вы хотите что-то делать программно. Итак, я составил свой собственный запрос:
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;