2009-08-19 9 views

Odpowiedz

99

Jeśli chcesz więcej niż tylko stół dotacji bezpośrednich (na przykład dotacje przez role, uprawnienia systemowe, takie jak wybrać dowolną tabeli, etc.), oto kilka dodatkowych zapytań:

przywileje 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; 

bezpośrednie dotacje dla tabel/widoków:

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; 

pośrednie dotacje do tabel/widoków:

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

Możesz nie mieć prawa do wyświetlenia tabeli sys.dba_sys_privs. – Hannes

+1

Absolutnie poprawne. Zobacz swój DBA. Jeśli odmówią, mogą mieć uzasadnione obawy dotyczące bezpieczeństwa. Widzenie zawartości tych widoków daje użytkownikowi informacje, których inaczej nie mogliby uzyskać. – DCookie

+2

Byłoby interesujące, aby po lewej stronie dołączyć do tabeli 'role_role_privs', a następnie' CONNECT BY PRIOR granted_role = role', aby powrócić do przechodnich przywilejów roli ... –

27

Zakładając chcesz wymienić dotacje na wszystkich obiektów dany użytkownik otrzymanych:

select * from all_tab_privs_recd where grantee = 'your user' 

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

4
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') 
; 
+5

Niektóre wyjaśnienia pomogłyby tej odpowiedzi, gdy inni ludzie ją znajdą. –

12

Sorry chłopaki, ale wybierając z all_tab_privs_recd gdzie uprawniony = „Twój użytkownik” nie daje żadnych wyjścia z wyjątkiem dotacji publicznych i aktualnych dotacji użytkowników po uruchomieniu wybierać spośród różnych (powiedzmy, SYS) użytkownik . Jako dokumentacja mówi,

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 chcą wymienić wszystkie obiektowi dotacje dla konkretnego (nie SYS sam) użytkownik nie może używać tego widoku systemu.

W takim przypadku należy wykonać bardziej złożone zapytanie. Oto jeden wzięty (śledzenie) z TOAD, aby zaznaczyć wszystkie dotacje 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; 

Będzie to lista wszystkich obiektów (w tym dotacje dotacje kolumn) (nieokreślone) użytkownika. Jeśli nie chcesz przyznania poziomu kolumn, usuń całą część zaznaczenia rozpoczynając od klauzuli "union".

UPD: Studiowanie dokumentacji znalazłem inny widok, który zawiera listę wszystkich dotacji w znacznie prostszy sposób:

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

pamiętać, że istnieje bez widoku DBA_TAB_PRIVS_RECD w Oracle.

7

Najbardziej wszechstronna i niezawodna metoda wiem, wciąż jest za pomocą 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 chociaż.

Powiązane problemy