Jak mogę wymienić wszystkie granty otrzymane przez użytkownika?

Muszę zobaczyć wszystkie dotacje na Oracle DB.

Użyłem funkcji TOAD do porównywania schematów, ale nie pokazuje kuszących dotacji itp. więc mam pytanie:

Jak mogę wymienić wszystkie dotacje na Oracle DB?

Author: NullUserException, 2009-08-19

5 answers

Jeśli chcesz coś więcej niż tylko bezpośrednie dotacje do tabeli (np. dotacje za pośrednictwem ról, uprawnienia systemowe, takie jak select any table, itp.), oto kilka dodatkowych zapytań:

Uprawnienia systemowe dla użytkownika:

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;

Dotacje bezpośrednie do tabel / odsłon:

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;

Dotacje pośrednie do tabel/odsłon:

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;
 112
Author: DCookie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-19 17:09:36

Zakładając, że chcesz wyświetlić listę grantów na wszystkich obiektach konkretny użytkownik otrzymał :

select * from all_tab_privs_recd where grantee = 'your user'

To nie zwróci obiektów należących do użytkownika. Jeśli ich potrzebujesz, użyj widoku all_tab_privs.

 28
Author: Juris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-19 08:34:20

Sorry chłopaki, ale wybranie z all_tab_privs_recd gdzie grantee = 'twój użytkownik' nie da żadnych wyników z wyjątkiem dotacji publicznych i bieżących dotacji użytkowników, jeśli uruchomisz select od innego (powiedzmy, SYS) użytkownika. Jak mówi dokumentacja,

ALL_TAB_PRIVS_RECD opisuje następujące rodzaje dotacji:

Object grants for which the current user is the grantee
Object grants for which an enabled role or PUBLIC is the grantee

Tak więc, jeśli jesteś DBA i chcesz wyświetlić listę wszystkich obiektów dla konkretnego użytkownika (nie samego SYS), nie możesz użyć tego widoku systemowego.

W w tym przypadku musisz wykonać bardziej złożone zapytanie. Oto jeden pobrany (śledzony) z TOAD, aby wybrać wszystkie granty obiektu dla konkretnego użytkownika:

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;

Wyświetli listę wszystkich grantów obiektów (w tym grantów kolumn) dla Twojego (określonego) użytkownika. Jeśli nie chcesz uprawnień na poziomie kolumn, usuń całą część select zaczynającą się od klauzuli 'union'.

UPD: studiując dokumentację znalazłem inny widok, który wymienia wszystkie granty w znacznie prostszy sposób:

select * from DBA_TAB_PRIVS where grantee = 'your user';

Należy pamiętać, że istnieje no DBA_TAB_PRIVS_RECD widok w Oracle.

 14
Author: Alex Cherkas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-16 10:40:44

Najbardziej wszechstronną i niezawodną metodą jaką znam jest jeszcze użycie 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;
Ciekawe odpowiedzi.
 8
Author: Matteo Steccolini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-01 10:47:45
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')
;
 4
Author: Sujit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-27 21:10:40