Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como mesclar dois dados de banco de dados idênticos em um?


Você diz que ambos os clientes estão usando seu aplicativo, então presumo que seja algum tipo de software "shrink-wrap" usado por mais clientes do que apenas esses dois, correto?

Se sim, adicionar colunas especiais às tabelas ou algo assim provavelmente causará problemas no futuro, porque você teria que manter uma versão especial para esses dois clientes que pode lidar com as colunas adicionais. Ou você teria que introduzir essas colunas em sua base de código principal, o que significa que todos os seus outros clientes também as receberiam.

Posso pensar em uma maneira mais fácil de fazer isso sem alterar nenhuma de suas tabelas ou adicionar colunas.
Para que isso funcione, você precisa descobrir o maior ID que existe em ambos os bancos de dados juntos ( não importa em qual tabela ou em qual banco de dados esteja) .

Isso pode exigir alguns copiar e colar para obter muitas consultas que se parecem com isso:
select max(id) as maxlocationid from locations
select max(id) as maxpersonid from persons
-- and so on... (one query for each table)

Quando você encontrar o maior ID depois de executar a consulta em ambos os bancos de dados, pegue um número maior que esse ID e adicione-o a todos os IDs em todas as tabelas do segundo banco de dados.
É muito importante que o número precisa ser maior que o maior ID que já existe em ambos os bancos de dados!

É um pouco difícil de explicar, então aqui está um exemplo:

Digamos que o maior ID em qualquer tabela em ambos os bancos de dados seja 8000 .
Então você executa algum SQL que adiciona 10000 para cada ID em cada tabela no segundo banco de dados :
update Locations set Id = Id + 10000
update Persons set Id = Id + 10000, LocationId = LocationId + 10000
-- and so on, for each table

As consultas são relativamente simples, mas esta é a que dá mais trabalho porque você tem que construir uma consulta como essa manualmente para cada tabela do banco de dados, com os nomes corretos de todas as colunas de ID.

Depois de executar a consulta no segundo banco de dados, os dados de exemplo da sua pergunta ficarão assim:

Banco de dados 1: (exatamente como antes)

Locations :
Id    Name         Adress   etc....
1     Location 1
2     Location 2

Persons :
Id    LocationId     Name     etc...
1     1              Alex
2     1              Peter
3     2              Lisa

Banco de dados 2:

Locations :
Id    Name         Adress   etc....
10001 Location A
10002 Location B

Persons :
Id    LocationId     Name     etc...
10001 10001          Mark
10002 10002          Ashley
10003 10001          Ben

E é isso! Agora você pode importar os dados de um banco de dados para o outro, sem obter nenhuma violação de chave primária.