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


113

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

Respostas:


164

Você pode tentar as visualizações abaixo.

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

DBAs e outros usuários avançados podem encontrar os privilégios concedidos a outros usuários com as DBA_versões 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 todos 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;

21

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

Se você quiser escrevê-lo sozinho, a consulta será um tanto desafiadora. Os usuários podem receber privilégios de sistema que são visíveis em DBA_SYS_PRIVS. Eles podem receber privilégios de objeto que são visíveis em DBA_TAB_PRIVS. E eles podem receber funções que são visíveis em DBA_ROLE_PRIVS(funções podem ser padrão ou não padrão e também podem exigir uma senha, então só porque um usuário recebeu uma função não significa que ele pode necessariamente usar os privilégios que ele adquirida por meio da função por padrão). Mas esses papéis podem, por sua vez, ser privilégios concedidos sistema, privilégios de objeto e funções adicionais que podem ser vistos olhando ROLE_SYS_PRIVS, ROLE_TAB_PRIVSe ROLE_ROLE_PRIVS. O script de Pete percorre esses relacionamentos para mostrar todos os privilégios que acabam fluindo para um usuário.


O script é incrível, basta dar uma olhada
I. Tyger

1
Você precisa de privilégios para o pacote UTL_FILE ou então você obterá um erro ao executar o script de Pete Finnigan: "identificador 'UTL_FILE' deve ser declarado". Você pode se conectar como sys com roll sysdba por meio do SQL Developer e então ele funcionará ou concederá a si mesmo privilégios de execução para este pacote usando: grant execute on UTL_FILE para <user>;
janeiro

1
E para aqueles de nós sem SYSprivilégios e apenas desejam examinar os privilégios de nossa própria conta, o script é totalmente inútil. Eu não tenho acesso a UTL_FILEnem DBA_SYS_PRIVSe outro DBAe SYSáreas os olhares de script no.
vapcguy

Eu não acho ROLE_SYS_PRIVS, ROLE_TAB_PRIVSe ROLE_ROLE_PRIVSprecisa ser examinado. Os documentos indicam que são para o usuário atual .
jpmc26

Se alguém tiver uma cópia desses scripts, pode postar aqui ou em algum lugar um pouco mais perene, como uma essência? O site está fora do ar.
Michael Thompson


2

Embora a resposta de Raviteja Vutukuri funcione e seja rápida de montar, ela não é particularmente flexível para variar os filtros e não ajuda muito se você estiver procurando fazer algo programaticamente. Então, eu montei 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:

  • Posso facilmente filtrar por várias informações diferentes, como o objeto, o privilégio, seja por meio de uma função específica, etc., apenas alterando aquela WHERE cláusula.
  • É uma única consulta, o que significa que não preciso compor mentalmente os resultados juntos.
  • Resolve 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") em diferentes fontes de privilégio.
  • É fácil ver tudo o que preciso fazer para revogar o privilégio, uma vez que lista todas as fontes do privilégio.
  • Ele combina privilégios de tabela e de sistema em uma única visão coerente, permitindo-nos listar todos os privilégios de um usuário de uma só vez.
  • É uma consulta , não uma função que expõe tudo isso para DBMS_OUTPUTou algo assim (em comparação com o script vinculado de Pete Finnigan). Isso o torna útil para uso programático e para exportação.
  • O filtro não se repete; ele só aparece uma vez. Isso torna mais fácil mudar.
  • A subconsulta pode ser facilmente retirada se você precisar examiná-la por cada indivíduo GRANT.

Alguns TODOs para mim: 1. Adicionar indicador se o usuário puder conceder o privilégio ao conceder uma função a outro usuário. 2. Descubra como fazer isso para o usuário atual sem privilégios de DBA. Provavelmente envolve USER_SYS_PRIVS(privilégios de sistema concedidos diretamente), USER_TAB_PRIVS(privilégios de objeto concedidos diretamente) USER_ROLE_PRIVS(funções concedidas diretamente ao usuário), ROLE_ROLE_PRIVS(para obter funções herdadas), ROLE_SYS_PRIVS(privs de sistema por meio de funções) e ROLE_TAB_PRIVS(privs de objeto por meio de funções). Ugh. Oracle é tão complicado.
jpmc26

1

Você pode usar o código abaixo para obter todas as listas de privilégios de todos os usuários.

select * from dba_sys_privs 

Isso não lista todos os privilégios. Conforme demonstrado por várias outras respostas que precedem as suas por anos , ele omite os privilégios de tabela e todos os privilégios concedidos por meio de funções.
jpmc26

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.