Come posso elencare TUTTE le sovvenzioni ricevute da un utente?


97

Ho bisogno di vedere tutte le concessioni su un DB Oracle.

Ho usato la funzione TOAD per confrontare gli schemi ma non mostra le sovvenzioni temporanee ecc. Quindi c'è la mia domanda:

Come posso elencare tutte le concessioni su un database Oracle?

Risposte:


141

Se desideri qualcosa di più delle concessioni di tabelle dirette (ad esempio, concessioni tramite ruoli, privilegi di sistema come selezionare qualsiasi tabella, ecc.), Ecco alcune query aggiuntive:

Privilegi di sistema per un utente:

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;

Sovvenzioni dirette a tabelle / visualizzazioni:

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;

Sovvenzioni indirette a tabelle / visualizzazioni:

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
Potresti non avere il diritto di visualizzare la tabella sys.dba_sys_privs.
Hannes

1
Assolutamente corretto. Vedi il tuo DBA. Se rifiutano, potrebbero avere legittimi problemi di sicurezza. La visualizzazione del contenuto di queste viste fornisce all'utente informazioni che altrimenti non sarebbe in grado di avere.
DCookie

2
Sarebbe interessante lasciare unirsi al role_role_privstavolo e poi CONNECT BY PRIOR granted_role = rolericorrere ai privilegi di ruolo transitivi ...
Lukas Eder

33

Supponendo che tu voglia elencare le concessioni su tutti gli oggetti che un particolare utente ha ricevuto :

select * from all_tab_privs_recd where grantee = 'your user'

Questo non restituirà oggetti di proprietà dell'utente. Se ti servono, usa all_tab_privsinvece la vista.


20

Scusate ragazzi, ma selezionando all_tab_privs_recd dove grantee = 'your user' non darà alcun output eccetto le concessioni pubbliche e le concessioni dell'utente corrente se esegui la selezione da un utente diverso (diciamo, SYS). Come dice la documentazione,

ALL_TAB_PRIVS_RECD descrive i seguenti tipi di sovvenzioni:

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

Quindi, se sei un amministratore di database e desideri elencare tutte le concessioni di oggetti per un particolare utente (non SYS stesso), non puoi utilizzare quella vista di sistema.

In questo caso, è necessario eseguire una query più complessa. Eccone uno preso (tracciato) da TOAD per selezionare tutte le concessioni di oggetti per un particolare utente:

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;

Questo elencherà tutte le concessioni di oggetti (incluse le concessioni di colonna) per l'utente (specificato). Se non desideri concedere autorizzazioni a livello di colonna, elimina tutta la parte della selezione che inizia con la clausola "union".

UPD: Studiando la documentazione ho trovato un'altra vista che elenca tutte le sovvenzioni in modo molto più semplice:

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

Tieni presente che non esiste una vista DBA_TAB_PRIVS_RECD in Oracle.


12

Il metodo più completo e affidabile che conosco è ancora quello di utilizzare 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;

Risposte interessanti però.


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
Qualche spiegazione aiuterebbe questa risposta, per quando altre persone vengono e la trovano.
Andrew Barber,

0

La seguente query puòessere utilizzata per ottenere tutti i privilegi di un utente .. Fornisci semplicemente il nome utente nella prima query e otterrai tutti i privilegi per quello

WITH users AS (SELECT 'SCHEMA_USER' usr FROM dual), Roles AS (SELECT grant_role FROM dba_role_privs rp JOIN users ON rp.GRANTEE = users.usr UNION SELECT grant_role FROM role_role_privs WHERE role IN (SELEZIONA grant_role FROM dba_role_privs rp. 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_Tab_Privs dtp users dtp. usr), sys_privileges AS (SELEZIONA privilegio FROM dba_sys_privs dsp JOIN users ON dsp.grantee = users.usr) SELECT * FROM tab_privilage ORDER BY proprietario, table_name --SELECT * FROM sys_privileges

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.