Мне нужно увидеть все гранты в Oracle DB.
Я использовал функцию TOAD для сравнения схем, но она не отображает искушаемые гранты и т.д., так что мой вопрос:
Как я могу перечислять все гранты в Oracle DB?
Мне нужно увидеть все гранты в Oracle DB.
Я использовал функцию TOAD для сравнения схем, но она не отображает искушаемые гранты и т.д., так что мой вопрос:
Как я могу перечислять все гранты в Oracle DB?
Если вы хотите больше, чем просто прямые табличные гранты (например, гранты через роли, системные привилегии, такие как выбор любой таблицы и т.д.), вот несколько дополнительных запросов:
Системные привилегии для пользователя:
SELECT PRIVILEGE
FROM sys.dba_sys_privs
WHERE grantee = <theUser>
UNION
SELECT PRIVILEGE
FROM dba_role_privs rp JOIN role_sys_privs rsp ON (rp.granted_role = rsp.role)
WHERE rp.grantee = <theUser>
ORDER BY 1;
Прямые гранты для таблиц/просмотров:
SELECT owner, table_name, select_priv, insert_priv, delete_priv, update_priv, references_priv, alter_priv, index_priv
FROM table_privileges
WHERE grantee = <theUser>
ORDER BY owner, table_name;
Косвенные гранты для таблиц/просмотров:
SELECT DISTINCT owner, table_name, PRIVILEGE
FROM dba_role_privs rp JOIN role_tab_privs rtp ON (rp.granted_role = rtp.role)
WHERE rp.grantee = <theUser>
ORDER BY owner, table_name;
Предполагая, что вы хотите перечислить гранты для всех объектов, полученных определенным пользователем:
select * from all_tab_privs_recd where grantee = 'your user'
Это не возвращает объекты, принадлежащие пользователю. Если вам это нужно, используйте all_tab_privs
. Вместо этого.
Извините, ребята, но выбрав из all_tab_privs_recd, где grantee = 'ваш пользователь' не будет давать никаких результатов, кроме государственных грантов и текущих пользовательских грантов, если вы запустите выбор из другого (скажем, SYS) пользователя. Как говорится в документации,
ALL_TAB_PRIVS_RECD описывает следующие типы грантов:
Object grants for which the current user is the grantee Object grants for which an enabled role or PUBLIC is the grantee
Итак, если вы являетесь администратором базы данных и хотите перечислять все объекты гранты для определенного (а не самого SYS) пользователя, вы не можете использовать этот системный вид.
В этом случае вы должны выполнить более сложный запрос. Вот одно взятое (прорисованное) из TOAD, чтобы выбрать все целевые гранты для конкретного пользователя:
select tpm.name privilege,
decode(mod(oa.option$,2), 1, 'YES', 'NO') grantable,
ue.name grantee,
ur.name grantor,
u.name owner,
decode(o.TYPE#, 0, 'NEXT OBJECT', 1, 'INDEX', 2, 'TABLE', 3, 'CLUSTER',
4, 'VIEW', 5, 'SYNONYM', 6, 'SEQUENCE',
7, 'PROCEDURE', 8, 'FUNCTION', 9, 'PACKAGE',
11, 'PACKAGE BODY', 12, 'TRIGGER',
13, 'TYPE', 14, 'TYPE BODY',
19, 'TABLE PARTITION', 20, 'INDEX PARTITION', 21, 'LOB',
22, 'LIBRARY', 23, 'DIRECTORY', 24, 'QUEUE',
28, 'JAVA SOURCE', 29, 'JAVA CLASS', 30, 'JAVA RESOURCE',
32, 'INDEXTYPE', 33, 'OPERATOR',
34, 'TABLE SUBPARTITION', 35, 'INDEX SUBPARTITION',
40, 'LOB PARTITION', 41, 'LOB SUBPARTITION',
42, 'MATERIALIZED VIEW',
43, 'DIMENSION',
44, 'CONTEXT', 46, 'RULE SET', 47, 'RESOURCE PLAN',
66, 'JOB', 67, 'PROGRAM', 74, 'SCHEDULE',
48, 'CONSUMER GROUP',
51, 'SUBSCRIPTION', 52, 'LOCATION',
55, 'XML SCHEMA', 56, 'JAVA DATA',
57, 'EDITION', 59, 'RULE',
62, 'EVALUATION CONTEXT',
'UNDEFINED') object_type,
o.name object_name,
'' column_name
from sys.objauth$ oa, sys.obj$ o, sys.user$ u, sys.user$ ur, sys.user$ ue,
table_privilege_map tpm
where oa.obj# = o.obj#
and oa.grantor# = ur.user#
and oa.grantee# = ue.user#
and oa.col# is null
and oa.privilege# = tpm.privilege
and u.user# = o.owner#
and o.TYPE# in (2, 4, 6, 9, 7, 8, 42, 23, 22, 13, 33, 32, 66, 67, 74, 57)
and ue.name = 'your user'
and bitand (o.flags, 128) = 0
union all -- column level grants
select tpm.name privilege,
decode(mod(oa.option$,2), 1, 'YES', 'NO') grantable,
ue.name grantee,
ur.name grantor,
u.name owner,
decode(o.TYPE#, 2, 'TABLE', 4, 'VIEW', 42, 'MATERIALIZED VIEW') object_type,
o.name object_name,
c.name column_name
from sys.objauth$ oa, sys.obj$ o, sys.user$ u, sys.user$ ur, sys.user$ ue,
sys.col$ c, table_privilege_map tpm
where oa.obj# = o.obj#
and oa.grantor# = ur.user#
and oa.grantee# = ue.user#
and oa.obj# = c.obj#
and oa.col# = c.col#
and bitand(c.property, 32) = 0 /* not hidden column */
and oa.col# is not null
and oa.privilege# = tpm.privilege
and u.user# = o.owner#
and o.TYPE# in (2, 4, 42)
and ue.name = 'your user'
and bitand (o.flags, 128) = 0;
Здесь будут перечислены все целевые гранты (включая гранты столбцов) для вашего (заданного) пользователя. Если вам не нужны гранты уровня столбца, тогда удалите всю часть начала выбора с помощью предложения union.
UPD: Изучая документацию, я нашел другое представление, в котором перечислены все гранты гораздо проще:
select * from DBA_TAB_PRIVS where grantee = 'your user';
Имейте в виду, что в Oracle существует no DBA_TAB_PRIVS_RECD.
Самый полный и надежный метод, который я знаю, по-прежнему использует DBMS_METADATA:
select dbms_metadata.get_granted_ddl( 'SYSTEM_GRANT', :username ) from dual;
select dbms_metadata.get_granted_ddl( 'OBJECT_GRANT', :username ) from dual;
select dbms_metadata.get_granted_ddl( 'ROLE_GRANT', :username ) from dual;
Интересные ответы.
select distinct 'GRANT '||privilege||' ON '||OWNER||'.'||TABLE_NAME||' TO '||RP.GRANTEE
from DBA_ROLE_PRIVS RP join ROLE_TAB_PRIVS RTP
on (RP.GRANTED_ROLE = RTP.role)
where (OWNER in ('YOUR USER') --Change User Name
OR RP.GRANTEE in ('YOUR USER')) --Change User Name
and RP.GRANTEE not in ('SYS', 'SYSTEM')
;