> > 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
