segunda-feira, 16 de maio de 2016

Debug #7 - Tabelas sem permissão de acesso (Oracle)


Em uma aplicação onde uso o banco de dados Oracle, tive um problema ao tentar realizar um select na tabela e o erro retornado era "table or view does not exist".

Primeiro passo, abri meu gerenciador de banco de dados, a tabela estava lá, então ela existia. Mas além da possibilidade da tabela não existir (que é o que a mensagem descreve), esse erro acontece também quando o seu usuário não tem as permissões necessárias para uso da tabela. E esse era o meu problema!


Debug #8 - Tabelas sem permissão de acesso (Oracle)


Como era um select simples,foi fácil identificar a tabela que "estava com problema". Mas em casos onde possui vários joins, pode ficar dificil identificar qual tabela não possui as permissões necessárias.
Para auxilia-los e verificar quais são as tabelas que o seu usuário não possui permissões use o script abaixo:

WITH PRIVILEGIO AS (
        SELECT * FROM SYS.DBA_TAB_PRIVS P
         WHERE (P.OWNER = 'USUARIO_01')
           AND (P.GRANTEE = 'USUARIO_02')
           AND P.PRIVILEGE = 'SELECT'
  ), OBJETO AS (
        SELECT O.OBJECT_NAME NOME FROM DBA_OBJECTS O
         WHERE (O.OWNER = 'USUARIO_01')
           AND O.OBJECT_TYPE IN ('TABLE', 'VIEW', 'SEQUENCE', 'SYNONYM')
  )
SELECT *
  FROM OBJETO O
  LEFT OUTER JOIN  PRIVILEGIO P ON O.NOME = P.TABLE_NAME
 WHERE P.PRIVILEGE IS NULL;


Os valores "P.OWNER" e "P.GRANTEE" são os nomes do seu usuário, na minha aplicação eu tenho um usuário se banco de dados "usuario_01" e um usuário da aplicação "usuario_02".

O valor "P.PRIVILEGE", são os tipos de privilégios que você pretende verificar se foram liberadas. E o valor de "O.OBJECT_TYPE" é onde você quer verificar se as permissões foram liberadas.

Todos os lugares onde seu usuário não tiver permissão será listado, considerando o seu escopo de busca em OBJECT_TYPE.
Legal, mas e para liberar permissão?

Você usa esse script aqui:

GRANT SELECT ON NOME_DA_TABELA TO NOME_DO_USUARIO;

Bom, é isso qualquer dúvida deixa seu comentário.
Até a próxima!
Luiz Fagner Zordan Analista de Sistemas

Graduado em Sistemas de Informação, atualmente trabalhando na Embraer pela FocusNetworks como FullStack. Sou apaixonado por tecnologia, fascinado por jogos e adoro passar o tempo assistindo séries.