[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 INSERT, UPDATE 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
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!!!!