Como posso listar TODAS as concessões recebidas por um usuário?

97

Preciso ver todas as concessões em um banco de dados Oracle.

Usei o recurso TOAD para comparar esquemas, mas ele não mostra concessões tentáveis ​​etc., então aí está minha dúvida:

Como posso listar todas as concessões em um banco de dados Oracle?

guerda
fonte

Respostas:

141

Se você quiser mais do que apenas concessões diretas de tabela (por exemplo, concessões por meio de funções, privilégios de sistema, como selecionar qualquer tabela, etc.), aqui estão algumas consultas adicionais:

Privilégios de sistema para um usuário:

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;

Concessões diretas a tabelas / visualizações:

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;

Concessões indiretas para tabelas / visualizações:

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
fonte
1
Você pode não ter o direito de ver a tabela sys.dba_sys_privs.
Hannes
1
Absolutamente correto. Consulte seu DBA. Se eles se recusarem, eles podem ter preocupações legítimas de segurança. Ver o conteúdo dessas visualizações fornece ao usuário informações que ele não conseguiria obter de outra forma.
DCookie
2
Seria interessante se juntar à role_role_privsmesa e depois CONNECT BY PRIOR granted_role = rolerecursar para privilégios de papel transitivos ...
Lukas Eder,
33

Supondo que você deseja listar concessões em todos os objetos que um determinado usuário recebeu :

select * from all_tab_privs_recd where grantee = 'your user'

Isso não retornará objetos pertencentes ao usuário. Se você precisar deles, use o modo de all_tab_privsexibição.

Juris
fonte
20

Desculpe pessoal, mas selecionando de all_tab_privs_recd onde grantee = 'seu usuário' não dará nenhuma saída, exceto concessões públicas e concessões ao usuário atual se você executar a seleção de um usuário diferente (digamos, SYS). Como diz a documentação,

ALL_TAB_PRIVS_RECD descreve os seguintes tipos de concessões:

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

Portanto, se você é um DBA e deseja listar todas as concessões de objeto para um usuário específico (não o próprio SYS), não pode usar essa visão do sistema.

Nesse caso, você deve realizar uma consulta mais complexa. Aqui está um obtido (rastreado) do TOAD para selecionar todas as concessões de objeto para um usuário específico:

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;

Isso listará todas as concessões de objeto (incluindo concessões de coluna) para seu usuário (especificado). Se você não quiser concessões de nível de coluna, exclua toda a parte da seleção começando com a cláusula 'união'.

UPD: estudando a documentação, encontrei outra visão que lista todas as concessões de uma maneira muito mais simples:

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

Lembre-se de que não visão DBA_TAB_PRIVS_RECD no Oracle.

Alex Cherkas
fonte
12

O método mais abrangente e confiável que conheço ainda é o uso de 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;

Mas respostas interessantes.

Matteo Steccolini
fonte
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
fonte
7
Alguma explicação ajudaria nessa resposta, para quando outras pessoas vierem e encontrarem.
Andrew Barber,
0

A consulta a seguir pode ser usada para obter todos os privilégios de um usuário .. Basta fornecer o nome de usuário na primeira consulta e você obterá todos os privilégios para isso

COM os usuários AS (SELECIONE 'SCHEMA_USER' usr FROM dual), Funções AS (SELECIONE grant_role FROM dba_role_privs rp JOIN usuários ON rp.GRANTEE = users.usr UNION SELECT concedido_role FROM role_role_privs WHERE papel IN (SELECT concedido_role FROM dba_role_privs rp JOIN usuários ON rp). GRANTEE = users.usr)), tab_privilage AS (SELECIONE PROPRIETÁRIO, TABLE_NAME, PRIVILÉGIO DE role_tab_privs rtp JOIN funções r ON rtp.role = r.granted_role UNION SELECIONE PROPRIETÁRIO, TABLE_NAME, PRIVILÉGIO DE Dba_Tab_Privs dtp JOIN users ON dtp.grantee usuários. usr), sys_privileges AS (SELECT privilégio FROM dba_sys_privs dsp JOIN usuários ON dsp.grantee = users.usr) SELECT * FROM tab_privilage ORDER BY proprietário, table_name --SELECT * FROM sys_privileges

Pradeep Dewani
fonte