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