Em 27 de junho de 2017 09:14, Celso - Gmail <clorenzett...@gmail.com>
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].


[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


-- 
   Euler Taveira                                   Timbira -
http://www.timbira.com.br/
   PostgreSQL: Consultoria, Desenvolvimento, Suporte 24x7 e Treinamento
<http://www.timbira.com.br>
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a