Как я могу перечислить ВСЕ гранты, полученные пользователем?

98

Мне нужно увидеть все гранты по БД Oracle.

Я использовал функцию TOAD для сравнения схем, но она не показывает заманчивые гранты и т. Д., Поэтому есть мой вопрос:

Как я могу перечислить все гранты в базе данных Oracle?

Герда
источник

Ответы:

142

Если вам нужно больше, чем просто прямые гранты таблицы (например, гранты через роли, системные привилегии, такие как выбор любой таблицы и т. Д.), Вот несколько дополнительных запросов:

Системные привилегии для пользователя:

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;
DCookie
источник
1
Возможно, у вас нет прав на просмотр таблицы sys.dba_sys_privs.
Hannes
1
Совершенно верно. См. Своего администратора базы данных. Если они откажутся, у них могут возникнуть законные опасения по поводу безопасности. Просмотр содержимого этих представлений дает пользователю информацию, которую в противном случае он не смог бы получить.
DCookie
2
Было бы интересно присоединиться к левому role_role_privsстолу, а затем CONNECT BY PRIOR granted_role = roleвернуться к привилегиям транзитивных ролей ...
Лукас Эдер
33

Предполагая, что вы хотите перечислить гранты на все объекты , полученные конкретным пользователем. :

select * from all_tab_privs_recd where grantee = 'your user'

Это не вернет объекты, принадлежащие пользователю. Если они вам нужны, используйте all_tab_privsвместо этого просмотр.

Юрис
источник
20

Извините, ребята, но выбор из all_tab_privs_recd, где grantee = 'your user' не даст никаких результатов, кроме публичных грантов и текущих пользовательских грантов, если вы запустите выбор от другого (скажем, 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 нет представления DBA_TAB_PRIVS_RECD.

Алексей Черкас
источник
12

Самый полный и надежный метод, который я знаю, - это использование 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;

Хотя и интересные ответы.

Маттео Стекколини
источник
5
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')
;
Суджит
источник
7
Некоторое объяснение поможет этому ответу, потому что когда другие люди приходят и находят его.
Эндрю Барбер
0

Следующий запрос можно использовать для получения всех привилегий одного пользователя. Просто укажите имя пользователя в первом запросе, и вы получите все права для этого

С пользователями КАК (ВЫБЕРИТЕ 'SCHEMA_USER' usr FROM dual), Роли КАК (ВЫБЕРИТЕ grant_role FROM dba_role_privs rp СОЕДИНЯЙТЕ пользователей НА rp.GRANTEE = users.usr СОЕДИНЕНИЕ ВЫБЕРИТЕ grant_role FROM role_role_privs ГДЕ роль IN (ВЫБЕРИТЕ предоставленную_роль FROM rp_role_privs НА rp.privs_privs на rp_role_privs. GRANTEE = users.usr)), tab_privilage AS (SELECT OWNER, TABLE_NAME, PRIVILEGE FROM role_tab_privs rtp JOIN roles r ON rtp.role = r.granted_role UNION SELECT OWNER, TABLE_NAME, PRIVILEGE FROM Dba Users_Tabtee_Privs dn. usr), sys_privileges AS (привилегия SELECT FROM dba_sys_privs dsp JOIN users ON dsp.grantee = users.usr) SELECT * FROM tab_privilage ORDER BY owner, table_name --SELECT * FROM sys_privileges

Прадип Девани
источник