Jak mogę wymienić WSZYSTKIE dotacje otrzymane przez użytkownika?

97

Muszę zobaczyć wszystkie dotacje w bazie danych Oracle.

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

Jak wyświetlić listę wszystkich dotacji w bazie danych Oracle?

guerda
źródło

Odpowiedzi:

141

Jeśli chcesz czegoś więcej niż tylko bezpośrednie przydziały na tabele (np. Dotacje za pośrednictwem ról, uprawnienia systemowe, takie jak wybór dowolnej tabeli itp.), Oto kilka dodatkowych zapytań:

Uprawnienia systemowe 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 do 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;
DCookie
źródło
1
Możesz nie mieć prawa do przeglądania 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. Wyświetlenie zawartości tych widoków daje użytkownikowi informacje, których w innym przypadku nie mogliby mieć.
DCookie,
2
Byłoby interesujące, gdybyśmy odeszli do role_role_privsstołu, a następnie CONNECT BY PRIOR granted_role = rolepowrócili do przechodnich przywilejów ról ...
Lukas Eder
33

Zakładając, że chcesz wyświetlić przydziały dla wszystkich obiektów, które otrzymał dany użytkownik :

select * from all_tab_privs_recd where grantee = 'your user'

Nie zwróci to obiektów, których właścicielem jest użytkownik. Jeśli ich potrzebujesz, użyj all_tab_privszamiast tego widoku.

Juris
źródło
20

Przykro nam, ale wybranie z all_tab_privs_recd, gdzie grantee = 'twój użytkownik' nie da żadnych danych wyjściowych z wyjątkiem grantów publicznych i grantów dla aktualnego użytkownika, jeśli uruchomisz wybór z innego (powiedzmy, SYS) użytkownika. Jak mówi dokumentacja,

ALL_TAB_PRIVS_RECD opisuje następujące rodzaje grantów:

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ś administratorem bazy danych i chcesz wyświetlić listę wszystkich przydziałów obiektów dla określonego użytkownika (nie samego SYS), nie możesz użyć tego widoku systemowego.

W takim przypadku musisz wykonać bardziej złożone zapytanie. Oto jeden wzięty (prześledzony) z TOAD, aby wybrać wszystkie przydziały obiektów dla określonego 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;

Spowoduje to wyświetlenie wszystkich uprawnień do obiektów (w tym uprawnień do kolumn) dla (określonego) użytkownika. Jeśli nie chcesz przydziałów na poziomie kolumny, usuń całą część zaznaczenia zaczynającą się od klauzuli „union”.

UPD: Studiując dokumentację, 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ętaj, że w Oracle nie ma widoku DBA_TAB_PRIVS_RECD.

Alex Cherkas
źródło
12

Najbardziej wszechstronną i niezawodną metodą, jaką znam, jest nadal 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.

Matteo Steccolini
źródło
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')
;
Sujit
źródło
7
Pewne wyjaśnienie pomogłoby w tej odpowiedzi, gdy inni ludzie przyjdą i ją znajdą.
Andrew Barber,
0

Poniższe zapytanie może być użyte do uzyskania wszystkich uprawnień jednego użytkownika .. Po prostu podaj nazwę użytkownika w pierwszym zapytaniu, a uzyskasz wszystkie uprawnienia do tego

Z użytkownikami AS (SELECT 'SCHEMA_USER' usr FROM dual), Roles AS (SELECT grant_role FROM dba_role_privs rp DOŁĄCZ użytkowników ON rp.GRANTEE = users.usr UNION SELECT grant_role FROM role_role_privs WHERE role IN (SELECT grant_role FROM dba_role_prIN users. GRANTEE = users.usr)), tab_privilage AS (SELECT OWNER, TABLE_NAME, PRIVILEGE FROM role_tab_privs rtp DOŁĄCZ role r ON rtp.role = r.granted_role UNION SELECT OWNER, TABLE_NAME, PRIVILEGE FROM Dba_Tab_Privs JOIN ról. usr), sys_privileges AS (SELECT przywilej FROM dba_sys_privs dsp JOIN users ON dsp.grantee = users.usr) SELECT * FROM tab_privilage ORDER BY właściciel, nazwa_tabeli --WYBIERZ * Z sys_privileges

Pradeep Dewani
źródło