[Oracle] GRANT – Você conhece a DBA_TAB_PRIVS e DBA_TABLES?

[Oracle] GRANT – Você conhece a DBA_TAB_PRIVS e DBA_TABLES?

Fala, pessoal! Tudo certo? Hoje vamos falar um pouco sobre GRANT. Recentemente, recebi a tarefa de conceder um GRANT a um usuário específico, com a condição de que ele tivesse permissão apenas para SELECT em todas as tabelas do banco de dados. Vou compartilhar o passo a passo do que fiz, para ajudar quem estiver passando por algo parecido ou tiver alguma dúvida.

A primeira coisa a se fazer é entender claramente o pedido do cliente, que solicitou que o usuário tivesse somente o GRANT de SELECT. Sendo assim, é fundamental verificar quais permissões o usuário já possui e em quais objetos. Para isso, podemos consultar a tabela DBA_TAB_PRIVS, que lista todas as concessões de permissões nos objetos para o usuário em questão. Vamos executar uma consulta nessa tabela para identificar se existe algum GRANT de INSERTUPDATE ou DELETE para esse usuário.

Aqui está a query:

SELECT ‘REVOKE INSERT ON ‘ || OWNER || ‘.’ || TABLE_NAME || ‘ FROM CONSULTA/’ AS COMANDO
FROM DBA_TAB_PRIVS
WHERE GRANTEE = ‘NOME_DO_USUARIO’
AND PRIVILEGE = ‘INSERT’;

Na query acima, se não houver nenhum privilégio de INSERT, será exibida a mensagem “NO ROWS SELECTED”. Caso contrário, o comando de REVOKE aparecerá. A consulta já está pronta, então, se houver algum privilégio de INSERT, basta copiar e colar o comando gerado para revogar a permissão. Se você quiser verificar os privilégios de UPDATE ou DELETE, é só substituir “INSERT” pelo privilégio desejado.

Agora, precisamos conceder a permissão de SELECT para o usuário em todas as tabelas do banco de dados. No ORACLE, as permissões são aplicadas a cada objeto de forma individual, ou seja, uma por uma. Para simplificar esse processo, criei um SQL dinâmico, que gera o GRANT para cada objeto no banco de dados (lembrando que você precisa ter privilégios de DBA para executar esse comando).

Vamos utilizar a tabela DBA_TABLES, que contém informações sobre todas as tabelas do banco, independentemente de quem é o proprietário ou o usuário que está acessando os dados.

— query na dba_tables

SELECT ‘GRANT SELECT ON ‘ || OWNER || ‘.’ || TABLE_NAME || ‘ TO NOME_DO_USUARIO;’ AS COMANDO
FROM DBA_TABLES
WHERE OWNER NOT IN (‘SYS’, ‘SYSTEM’);  — Exclui schemas de sistema

Agora é só copiar e colar os comandos.

— query para views 

SELECT ‘GRANT SELECT ON ‘ || OWNER || ‘.’ || VIEW_NAME || ‘ TO NOME_DO_USUARIO;’ AS
COMANDO FROM DBA_VIEWS
WHERE OWNER NOT IN (‘SYS’, ‘SYSTEM’);  — Exclui schemas de sistema

— query para procedures

SELECT ‘GRANT EXECUTE ON ‘ || OWNER || ‘.’ || OBJECT_NAME || ‘ TO NOME_DO_USUARIO;’ AS COMANDO
FROM DBA_OBJECTS
WHERE OBJECT_TYPE = ‘PROCEDURE’
 AND OWNER NOT IN (‘SYS’, ‘SYSTEM’);  — Exclui schemas de sistema
— query para functions
SELECT ‘GRANT EXECUTE ON ‘ || OWNER || ‘.’ || OBJECT_NAME || ‘ TO CONSULTA;’ AS COMANDO
FROM DBA_OBJECTS
WHERE OBJECT_TYPE = ‘FUNCTION’
AND OWNER NOT IN (‘SYS’, ‘SYSTEM’);  — Exclui schemas de sistema

OBS: Caso você queira salvar a saída dos comandos em um arquivo .txt e depois rodar o script, basta usar o comando spool antes de executar a query.

Exemplo:

SQL> spool saida_grant.txt

SQL> rode a query acima

SQL> spool off

Agora, com o arquivo criado, você pode editá-lo conforme necessário e, quando quiser executar, basta digitar:

SQL> @saida_grant.txt

PRONTO!!

Espero ter ajudado, até a próxima!!!!

Tags: , , , , , , , , , , , , , , , , , , , , ,

Power Tuning
Visão geral da privacidade

Este site utiliza cookies para que possamos lhe proporcionar a melhor experiência de usuário possível. As informações dos cookies são armazenadas em seu navegador e executam funções como reconhecê-lo quando você retorna ao nosso site e ajudar nossa equipe a entender quais seções do site você considera mais interessantes e úteis.