Как я могу перечислить все гранты, полученные пользователем?
Мне нужно увидеть все гранты на Oracle DB.
Я использовал функцию жабы для сравнения схем, но она не показывает заманчивые гранты и т. д. так вот мой вопрос:
Как я могу перечислить все гранты в БД Oracle?
5 ответов:
Если вы хотите больше, чем просто прямые гранты таблицы (например, гранты через роли, системные привилегии, такие как выбор любой таблицы и т. д.), вот некоторые дополнительные запросы:
системные привилегии для пользователя:
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 = 'ваш пользователь' не даст никаких выходных данных, кроме публичных грантов и текущих пользовательских грантов, если вы запустите select от другого (скажем, 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) пользователя, вы не можете использовать это системное представление.
В этом случае нужно выполнить более сложный запрос. Вот один взятый (прослеженный) от жабы, чтобы выбрать все гранты объекта для конкретного пользователя:
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;
здесь будут перечислены все гранты объектов (включая гранты столбцов) для вашего (указанного) пользователя. Если вы не хотите получать гранты на уровне столбцов, удалите всю часть предложения select, начинающегося с "union".
UPD: изучая документацию, я нашел другое мнение, в котором перечислены все гранты во многом более простой способ:
select * from DBA_TAB_PRIVS where grantee = 'your user';
имейте в виду, что есть нет представление DBA_TAB_PRIVS_RECD в Oracle.
самый полный и надежный метод, который я знаю, все еще используется 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') ;