it-swarm-pt.tech

Como mostrar todos os privilégios de um usuário no oracle?

Alguém pode me dizer como mostrar todos os privilégios/regras de um usuário específico no console sql?

97
destiny

Você pode tentar estas visualizações abaixo.

SELECT * FROM USER_SYS_PRIVS; 
SELECT * FROM USER_TAB_PRIVS;
SELECT * FROM USER_ROLE_PRIVS;

Os DBAs e outros usuários avançados podem encontrar os privilégios concedidos a outros usuários com as versões DBA_ dessas mesmas visualizações. Eles são abordados na documentação .

Essas visualizações mostram apenas os privilégios concedidos diretamente ao usuário. Encontrar all os privilégios, incluindo aqueles concedidos indiretamente por meio de funções, requer instruções SQL recursivas mais complicadas:

select * from dba_role_privs connect by prior granted_role = grantee start with grantee = '&USER' order by 1,2,3;
select * from dba_sys_privs  where grantee = '&USER' or grantee in (select granted_role from dba_role_privs connect by prior granted_role = grantee start with grantee = '&USER') order by 1,2,3;
select * from dba_tab_privs  where grantee = '&USER' or grantee in (select granted_role from dba_role_privs connect by prior granted_role = grantee start with grantee = '&USER') order by 1,2,3,4;
141
Teja

Existem vários scripts flutuando que farão isso dependendo de quão louco você quer chegar. Eu pessoalmente usaria o script find_all_privs de Pete Finnigan

Se você quiser escrever você mesmo, a consulta fica bastante desafiadora. Os usuários podem receber privilégios de sistema visíveis em DBA_SYS_PRIVS. Eles podem receber privilégios de objeto visíveis em DBA_TAB_PRIVS. E eles podem receber papéis que são visíveis em DBA_ROLE_PRIVS (funções podem ser padrão ou não-padrão e podem exigir uma senha também, então apenas porque um usuário recebeu uma função não significa que o usuário pode necessariamente usar os privilégios ele adquiriu através do papel por padrão). Mas essas funções podem, por sua vez, receber privilégios de sistema, privilégios de objeto e funções adicionais que podem ser visualizadas olhando para ROLE_SYS_PRIVS, ROLE_TAB_PRIVS e ROLE_ROLE_PRIVS. O script de Pete percorre esses relacionamentos para mostrar todos os privilégios que acabam fluindo para um usuário.

18
Justin Cave

Outro recurso útil:

http://psoug.org/reference/roles.html

  • DBA_SYS_PRIVS 
  • DBA_TAB_PRIVS
  • DBA_ROLE_PRIVS
6
Ageu

Você pode usar o código abaixo para obter toda a lista de privilégios de todos os usuários.

select * from dba_sys_privs 
1
Ravi Bhushan

Enquanto resposta de Raviteja Vutukuri trabalha e é rápido para unir, não é particularmente flexível para variar os filtros e não ajuda muito se você estiver olhando para fazer algo de forma programática. Então eu coloquei minha própria consulta:

SELECT
    PRIVILEGE,
    OBJ_OWNER,
    OBJ_NAME,
    USERNAME,
    LISTAGG(GRANT_TARGET, ',') WITHIN GROUP (ORDER BY GRANT_TARGET) AS GRANT_SOURCES, -- Lists the sources of the permission
    MAX(ADMIN_OR_GRANT_OPT) AS ADMIN_OR_GRANT_OPT, -- MAX acts as a Boolean OR by picking 'YES' over 'NO'
    MAX(HIERARCHY_OPT) AS HIERARCHY_OPT -- MAX acts as a Boolean OR by picking 'YES' over 'NO'
FROM (
    -- Gets all roles a user has, even inherited ones
    WITH ALL_ROLES_FOR_USER AS (
        SELECT DISTINCT CONNECT_BY_ROOT GRANTEE AS GRANTED_USER, GRANTED_ROLE
        FROM DBA_ROLE_PRIVS
        CONNECT BY GRANTEE = PRIOR GRANTED_ROLE
    )
    SELECT
        PRIVILEGE,
        OBJ_OWNER,
        OBJ_NAME,
        USERNAME,
        REPLACE(GRANT_TARGET, USERNAME, 'Direct to user') AS GRANT_TARGET,
        ADMIN_OR_GRANT_OPT,
        HIERARCHY_OPT
    FROM (
        -- System privileges granted directly to users
        SELECT PRIVILEGE, NULL AS OBJ_OWNER, NULL AS OBJ_NAME, GRANTEE AS USERNAME, GRANTEE AS GRANT_TARGET, ADMIN_OPTION AS ADMIN_OR_GRANT_OPT, NULL AS HIERARCHY_OPT
        FROM DBA_SYS_PRIVS
        WHERE GRANTEE IN (SELECT USERNAME FROM DBA_USERS)
        UNION ALL
        -- System privileges granted users through roles
        SELECT PRIVILEGE, NULL AS OBJ_OWNER, NULL AS OBJ_NAME, ALL_ROLES_FOR_USER.GRANTED_USER AS USERNAME, GRANTEE AS GRANT_TARGET, ADMIN_OPTION AS ADMIN_OR_GRANT_OPT, NULL AS HIERARCHY_OPT
        FROM DBA_SYS_PRIVS
        JOIN ALL_ROLES_FOR_USER ON ALL_ROLES_FOR_USER.GRANTED_ROLE = DBA_SYS_PRIVS.GRANTEE
        UNION ALL
        -- Object privileges granted directly to users
        SELECT PRIVILEGE, OWNER AS OBJ_OWNER, TABLE_NAME AS OBJ_NAME, GRANTEE AS USERNAME, GRANTEE AS GRANT_TARGET, GRANTABLE, HIERARCHY
        FROM DBA_TAB_PRIVS
        WHERE GRANTEE IN (SELECT USERNAME FROM DBA_USERS)
        UNION ALL
        -- Object privileges granted users through roles
        SELECT PRIVILEGE, OWNER AS OBJ_OWNER, TABLE_NAME AS OBJ_NAME, GRANTEE AS USERNAME, ALL_ROLES_FOR_USER.GRANTED_ROLE AS GRANT_TARGET, GRANTABLE, HIERARCHY
        FROM DBA_TAB_PRIVS
        JOIN ALL_ROLES_FOR_USER ON ALL_ROLES_FOR_USER.GRANTED_ROLE = DBA_TAB_PRIVS.GRANTEE
    ) ALL_USER_PRIVS
    -- Adjust your filter here
    WHERE USERNAME = 'USER_NAME'
) DISTINCT_USER_PRIVS
GROUP BY
    PRIVILEGE,
    OBJ_OWNER,
    OBJ_NAME,
    USERNAME
;

Vantagens:

  • Eu facilmente posso filtrar várias informações diferentes, como o objeto, o privilégio, seja por meio de um papel específico, etc. apenas alterando essa cláusula WHERE.
  • É uma consulta única, o que significa que não preciso compor mentalmente os resultados juntos.
  • Ele soluciona a questão de saber se eles podem conceder o privilégio ou não e se inclui os privilégios para subobjetos (a parte "hierárquica") entre as origens de diferenças do privilégio.
  • É fácil ver tudo o que preciso fazer para revogar o privilégio, pois ele lista todas as fontes do privilégio.
  • Ele combina privilégios de tabela e sistema em uma única visão coerente, permitindo-nos listar all os privilégios de um usuário de uma só vez.
  • É um query, não uma função que expele tudo isso para DBMS_OUTPUT ou algo assim (comparado ao script vinculado de Pete Finnigan). Isso o torna útil para uso programático e para exportação.
  • O filtro não é repetido; só aparece uma vez. Isso facilita a mudança.
  • A subconsulta pode ser facilmente retirada se você precisar examiná-la por cada GRANT individual.
0
jpmc26

Para mostrar todos os privilégios:

selecione o nome de system_privilege_map;

0
Yerbol Baigarayev