Як я можу перерахувати ВСІ Гранти, отримані користувачем?


97

Мені потрібно переглянути всі гранти на БД Oracle.

Я використовував функцію TOAD для порівняння схем, але в ній не відображаються привабливі дотації тощо, тож є моє питання:

Як я можу перерахувати всі гранти в БД Oracle?

Відповіді:


141

Якщо ви хочете отримати більше, ніж просто прямі гранти таблиці (наприклад, гранти через ролі, системні привілеї, такі як вибір будь-якої таблиці тощо), ось кілька додаткових запитів:

Системні привілеї для користувача:

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;

1
Ви можете не мати права бачити таблицю sys.dba_sys_privs.
Ганнес

1
Абсолютно правильно. Дивіться свою DBA. Якщо вони відмовляться, вони можуть мати законні закони щодо безпеки. Перегляд вмісту цих представлень дає користувачеві інформацію, яку вони не змогли б мати в іншому випадку.
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 = 'ваш користувач' не дасть жодного результату, окрім загальнодоступних грантів та поточних грантів користувачів, якщо ви запускаєте вибір від іншого (скажімо, 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

Отже, якщо ви DBA і хочете перерахувати всі дотації об’єктів для конкретного користувача (а не для самого 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;

Тут буде вказано всі грантові об’єкти (включаючи грантові стовпці) для вашого (вказаного) користувача. Якщо ви не бажаєте дозволів на рівні стовпців, тоді видаліть усю частину вибору, починаючи з пункту "об'єднання".

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

Наступний запит можна використовувати для отримання всіх привілеїв одного користувача. Просто введіть ім’я користувача в першому запиті, і ви отримаєте всі привілеї до цього

З користувачами AS (SELECT 'SCHEMA_USER' usr FROM dual), Roles AS (SELECT dod_role FROM dba_role_privs rp ПРИЄДНАЙТЕСЬ до користувачів ON rp.GRANTEE = users.usr UNION SELECT dod_role FROM role_role_privs WHERE роль IN (SELECT given_role ROS__RP___RP___DER_SER_DOWS_DOW_SER_DOWS_DOW_SER_DOWS) грантозаявітель = users.usr)), tab_privilage AS (SELECT, ПІДПРИЄМЕЦЬ, TABLE_NAME, ПРИВІЛЕЙ ВІД role_tab_privs РЕЄСТРУЙСЯ ролі РТПА г на rtp.role = r.granted_role UNION SELECT, власник, TABLE_NAME, привілеї Dba_Tab_Privs DTP JOIN користувачів на dtp.grantee = користувачі. usr), sys_privileges AS (ВИБРАТИ привілей ВІД dba_sys_privs dsp ПРИЄДНАЙТЕ користувачів на dsp.grantee = users.usr) ВИБІР * ВІД ВІД ВИДАЛЕННЯ ЗАМОВЛЕННЯ власником, table_name - ВИБІР * ВІД sys_privileges

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.