Do fundo do baú
Achei uma postagem que fiz pra mim mesmo (what?!) em 2016. Ao reler, achei interessante, já que se tratava de um problema rotineiro. Vou repostar aqui. Espero que possa ajudar alguém!
Contextualizando: Estou trabalhando em um ambiente onde um problema recorrente nos deploys de novas versões de sistemas em produção são erros ocasionados por pacotes incompletos, quase sempre no que tange a scripts de banco de dados, quase sempre “grants” e “synonyms”.
Meu ambiente: sistemas informatizados que realizarão a persistência em bancos relacionais (especificamente, Oracle, a partir da versão 10).
Arquitetura aplicada ao Banco de dados – usuário owner (dono do schema e com poder para executar qualquer operação dentro do schema, com exceção de criação de usuários) e usuário “owner_aplicaco” que possui synonyms para os objetos que pode ler ou manipular (tableas, views, sequences, procedures, etc…).
É importante destacar que possuímos um padrão de nomenclatura para todo e qualquer objeto de banco de dados, o que sob meu ponto de vista, auxilia extremamente o processo de entendimento e desenvolvimento.
Para qualquer objeto de banco criado, conforme sua finalidade (leitura/escrita), o owner concede grants para roles específicas: uma role com a permissão “select”; uma role com as permissões “insert”, “update” e “delete”; uma role com a permissão “execute”.
Pois bem, seguindo o curso normal do dia, sabemos que algo deu errado quando nos deparamos com a mensagem enviada pela aplicação:
“ORA-00942: a tabela ou view não existe
00942. 00000 – “table or view does not exist”
Neste cenário, podemos ter as seguintes fontes causadoras (dentro do meu conhecimento, o que não quer dizer que não possam existir mais!):
- Uma das tabelas que deveria ser criada para o funcionamento adequado da versão que estamos deployando não está lá
- Uma das sequences (isso mesmo! Mesmo sendo uma sequence, o erro que é lançado é este) que deveria ser criada para o funcionamento adequado da versão que estamos deployando não está lá
- O grant que dá a permissão ao usuário para que este objeto de banco possa ser visualizado/visto/selecionado (grant select) não foi conedido a role responsável por esta permissão.
- O synonym que deveria ser criado pelo usuário “owner_aplicaco” não foi criado.
Possíveis soluções:
Pode ser que você, por algum motivo, você deseje efetuar a comparação entre seus objetos, os grants e o synonyms.
No meu caso, busquei comparar as tabelas do schema com grants e os synonyms. (para saber se todos os grants e synonyms batem com as tabelas que lá estão)
Utilizei os seguintes scripts:
- Para buscar as tabelas
select * from all_tables where owner = ‘OWNER’ — (onde OWNER = nome do seu schema)
- Para buscar as permissões
select * from all_tab_privs
where grantor = ‘OWNER’
and grantee = ‘NO_MEU_CASO_NOME_DA_ROLE’
and table_name not in(
select table_name from all_tab_privs where table_name like ‘SQ%’)
order by table_name
OBS: o sub select que estou utilizando aqui é para excluir os nomes das sequences que também são retornados nesta consulta. No meu ambiente, toda sequence começa com “SQ”
- Para buscar os synonyms
select * from ALL_SYNONYMS where owner = ‘USER_APLICACAO’
AND table_name not in(
SELECT table_name FROM ALL_SYNONYMS where table_name like ‘%SQ_%’)
ORDER BY SYNONYM_NAME
OBS: Situação idem a anterior. A consulta de synonyms retorna todo e qualquer objeto ao qual um synonym fo iatribuído. no meu caso, excluindo apenas as sequences eu obtive o resultado desejado.