De: pgbr-geral [mailto:[email protected]] Em nome de 
Euler Taveira
Enviada em: terça-feira, 27 de junho de 2017 10:26
Para: Comunidade PostgreSQL Brasileira
Assunto: Re: [pgbr-geral] Como descobrir as dependência de uma function/view no 
Postgresql 9.2?

 

Em 27 de junho de 2017 09:14, Celso - Gmail <[email protected]> escreveu:

Estou tentando descobrir na pg_depend as dependências entre os objetos do banco 
de dados.

 

O objetivo é exportar eles na ordem correta que devem ser criados/atualizados 
em outro banco de dados.

 

O pg_dump já exporta na ordem correta. Por que não usá-lo? Uma sugestão é fazer 
a cópia no formato custom (pg_dump -Fc), gerar uma lista de objetos com 
pg_restore (pg_restore -l), filtar essa lista com o objetos desejados (com sed, 
por exemplo) e usar essa nova lista para restaurar (pg_restore -L).

 

Imagino que em algum lugar deva existir essa informação, visto que o 
pg_dump/pg_restore faz isso.

Ou exista outro caminho para chegar neste objetivo.

 

Abaixo criei 3 objetos simples para exemplicar e facilitar que puder ajudar.

 

CREATE OR REPLACE VIEW vw_teste AS SELECT 1 AS emp_empresa;

CREATE OR REPLACE VIEW vw_teste_2 AS SELECT emp_empresa FROM vw_teste;

 

CREATE OR REPLACE FUNCTION fc_empresa() RETURNS INTEGER AS

$BODY$

   SELECT emp_empresa FROM vw_teste;

$BODY$

LANGUAGE sql;

 

Vale ressaltar que o postgres não sabe que a função fc_empresa tem como 
dependência a visão vw_teste. Para que a restauração não cause um erro (se ele 
restaurar a função antes do visão), é definido o parâmetro 
check_function_bodies como false; espera-se que ao final da restauração a visão 
também seja criada.

 

O SQL abaixo retorna apenas o Schema como dependência e “deveria” retornar a 
vw_teste também.

 

SELECT * FROM pg_depend where objid in (select oid from pg_class where relname 
= 'vw_teste_2');

 

Os objetos não se restringem a tabela, índice, sequência, visão, visão 
materializada, tipo composto ou tabela externa (que é armazenado no pg_class); 
outros objetos são armazenados em catálogos separados. Para isso você precisa 
consultar a coluna refclassid que indica o catálogo a ser consultado. Você terá 
que fazer vários OUTER JOINs para buscar todas as informações (o Fabrizio 
indicou em outro email uma consulta em [1] pode gerar as dependências).

O que você está precisando é de uma ferramenta de diff. Existem algumas tais 
como apgdiff [2], pgcmp [3] e EMS DB Comparer [4]. Eu venho desenvolvendo a 
ferramenta pgquarrel [5]. Diferente de outras ferramentas, ela não depende de 
outros aplicativos (como pg_dump), compara todos os objetos do postgres 
(algumas ferramentas suportam somente alguns objetos), executa em diversos 
sistemas operacionais (testado em Linux, Windows e FreeBSD), além de funcionar 
em diferentes versões (>= 9.0). Apesar de estar funcional, pode conter bugs. 
Teste antes de aplicar em produção (execute o pgquarrel, aplica o diff gerado, 
compare os esquemas gerados pelo pg_dump). Reporte bugs em [5].




Boa tarde Euler, obrigado pela ajuda.

 

O objetivo final é exatamente fazer um diff em bancos de produção (por isso o 
pg_dump não resolveria), é para atualizar a versão do nosso software nos 
clientes.

Já fazemos desta forma a bastante tempo, a intenção agora era evoluir nossa 
“ferramenta” para tratar as dependências.

Hoje isso é uma opção que é executada quando o software é atualizado e quando 
tem novas views e functions pode acontecer de criar fora da ordem necessária.

 

O parâmetro check_function_bodies resolve o problema por outro caminho, 
obrigado.

 


[1] https://wiki.postgresql.org/wiki/Pg_depend_display
[2] https://www.apgdiff.com/
[3] https://github.com/cbbrowne/pgcmp
[4] https://www.sqlmanager.net/en/products/postgresql/dbcomparer

[5] https://github.com/eulerto/pgquarrel




   PostgreSQL: Consultoria, Desenvolvimento, Suporte 24x7 e Treinamento

_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a