>
>  Se ainda não entendem o que quero dizer coloco o seguinte:
>  Tenho dois bancos de dados, um na matriz(matriz), outro na filial(filial).
>  Quero trabalhar apenas com um banco de dados(geral).
>  Como faço para que num banco de dados contenha todos os dados da matriz e
>  filial, mas com uma instrução única?
>

Então meu caro... aí foi você que não entendeu. Veja, as coisas não
são tão mágicas assim em bancos de dados. A linguagem SQL é poderosa
mas não faz milagres. Primeiro pense no quanto você conhece de SQL
antes de fazer alguma coisa. Pelas suas declarações aqui, eu percebo
que você conhece muito pouco. O que você imaginou que poderia ser uma
operação simples e trivial, não é. De forma alguma. Tem de ser feita
com muito cuidado, tabela por tabela. Não existe mágica que junte as
coisas. Alguns bancos possuem o que se conhece como "MERGE", que está
para entrar na versão 8.4 do PostgreSQL. Não entrou ainda. Mesmo assim
o MERGE é uma solução que faz as coisas tabela por tabela, não tem
milagre. Você vai ter de simular o MERGE fazendo os comandos SQL
adequados para produzir o mesmo efeito.

1º Crie um esquema separado e temporário para o seu segundo banco de
dados. Se o banco que você deseja "juntar" possui mais de um esquema,
você terá que criar um esquema temporário para cada um deles. Neste
caso recomendo enfáticamente exportar os dados e importa-los esquema
por esquema e não tudo de uma vez só.
2º Importe os dados da sua filial para o esquema separado. Esta é a
parte simples, que nunca vai funcionar do jeito que você está fazendo.
Faltou a  etapa 1.
3º Peque tabela por tabela e faça o MERGE. Isto significa fazer um
INSERT ... SELECT. A forma de fazer o INSERT ... SELECT é simples se
você usa chaves naturais. Se usa sequências... hum, será realmente
outra história, pois você não pode juntar os dados de duas tabelas com
a memsa PK, não é mesmo? Viu só... aqui as coisas se complicam um
pouco.
4º Para as tabelas que tem chaves artificiais, você terá que fazer um
"de... para", ou seja, trocar o valor das PKs desta tabela para uma
faixa de valores que ainda não foi utilizada pela tabela da matriz.
Você pode até mesmo manter duas sequências separadas para os dados
relativos a matriz e filiar, se desejar. A parte chata de alterar um
valor de uma PK, é que você tem que trocar o valor em todas tabelas
que fazem referência (FK) a esta PK. Isto dá um pouco mais de
trabalho.
5º Não esqueça de rever o próximo valor de todas as sequências, para
que elas não apontem para PKs cujo valor já foi utilizado.

Como você pode ver, o seu "juntar" duas bases não tem nada de trivial.
Não adianta colocar a culpa no PostgreSQL. Este é um problema clássico
em banco de dados que nenhum fornecedor consegue resolver
automaticamente... a não ser é claro que o seu sistema tivesse sido
modelado especificamente com este propósito. Aí entram as soluções de
replicação, que podem fazer algumas mágicas. Mas isto é outro assunto,
que dá muito mais trabalho do que as pessoas imaginam. E certamente
não foi o seu caso. Pois você não estaria fazendo este tipo de
pergunta.

Espero que você consiga resolver o seu problema por aí. Se achar que
as coisas estão muito difíceis, recomendo enfaticamente a contratação
de uma consultoria para lhe ajudar. As chances de alguma meleca bem
pegajosa acontecer no meio do caminho é realmente enorme. Tem muita
gente boa aqui na lista que poderá lhe ajudar se você precisar. Os
DBAs ainda tem boas justificativas para existirem na informática....
:-)

Atenciosamente,
Fábio Telles
-- 
blog: http://www.midstorm.org/~telles/
e-mail / jabber: [EMAIL PROTECTED]
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a