Pergunta

Eu tenho table a e table b. (SQL Server 2008)

Ambas as tabelas têm exatamente o mesmo esquema.

Para os propósitos desta questão, considere table a = minha tabela de dev local, table b = A tabela viva.

Eu preciso criar um script SQL (contendo UPDATE/DELETE/INSERT declarações) que atualizarão a Tabela B como a mesma da Tabela a. Esse script será implantado no banco de dados ao vivo.

Alguma ferramenta gratuita por aí que pode fazer isso, ou melhor ainda, uma maneira de fazer isso sozinho?

Estou pensando que provavelmente preciso fazer algum tipo de ingresso em todos os campos nas tabelas e, em seguida, gerar SQL dinâmico com base nisso.

Alguém tem alguma ideia?

EDITAR

Ok, pensei em esclarecer um pouco essa pergunta.

A tabela que eu preciso sincronizar é uma tabela de pesquisa simples. Os dados são muito simples e diretos.

Aqui está uma ideia do que TABLE A Pode parecer:

IdFoo          Activity      IsFoo
1              Foo           1
2              Bar           0

Aqui está uma ideia do que TABLE B Pode parecer:

IdFoo          Activity      IsFoo
1              Foo           1
2              Bar           1

Basicamente, tudo o que quero fazer é atualizar que BIT coluna (IsFoo) dentro TABLE B Para corresponder ao valor correspondente em TABLE A Para o mesmo Idfoo.

Tenha em mente:

  • TABLE A está na minha máquina local
  • TABLE B está no servidor ao vivo

Obviamente eu tenho um backup (confiável) de TABLE B Na minha máquina local, com o qual preciso script e execute o script no servidor ao vivo.

A tabela também possui integridade referencial (outras colunas que eu não mostrei). O que significa que não posso simplesmente excluir tudo em TABLE B e fazer uma inserção de TABLE A.

Este script será um único. Portanto, não há necessidade de fazer coisas como servidor vinculado, replicação, etc. Aprecie as respostas. =)

EDITAR:

OK - então eu fui com a resposta de Oleg (VS2010 Data Compare). Rápido, fácil e trabalha um charme.

Para não dizer que as outras respostas estão incorretas. Agradeço todas as respostas!

Foi útil?

Solução

Em casos muito simples, você poderá definir em seu servidor SQL local um novo servidor vinculado (consulte no Microsoft SQL Server Management Studio em "Objetos do servidor" / "servidor vinculado") e use INNER JOIN e OUTER JOIN Para descobrir diferenças entre as tabelas A e B.

Em uma situação real e mais complexa, você deve levar em consideração a integridade referencial, diferentes teclas estrangeiras e campos de identidade (Auto Incremental) existentes no banco de dados de destino, para que o script de atualização seja mais complexo. Então, recomendo que você não gaste seu tempo na criação de sincronização do seu desenvolvedor e banco de dados de produção e use uma ferramenta padrão. Eu uso, por exemplo, os recursos do Visual Studio Team Edition 2008 (ou edição do banco de dados) ou do Visual Studio 2010 Ultimate Edition para comparar dados em dois bancos de dados. Funciona muito bem.

Outras dicas

Resposta tardia, mas pode ser útil para os visitantes do tópico

Além de outras soluções mencionadas, posso sugerir a tentativa de dados do ApexSQL Diff. Ele pode comparar e sincronizar os dados do banco de dados do SQL Server (em bancos de dados ao vivo e backups) e automatizar e agendar migrações de dados. Também funciona com grandes bancos de dados e é capaz de executar comparações diretamente do SSMS.

Você pode baixar esta ferramenta gratuitamente e brincar com ela. Possui uma avaliação gratuita totalmente funcional e oferece uma edição da comunidade (após o término do período de teste) que funciona no banco de dados SQL Express e Azure SQL.

Para saber mais sobre a ferramenta, você pode visitar http://www.apexsql.com/sql_tools_datadiff.aspx

Se você deseja apenas sincronizar as tabelas e não se importa em revisar as mudanças antecipadamente o Mesclar O comando pode fazer isso.

MSDN - Merge (Transact -SQL)

O Microsoft SSDT (gratuito) também possui dados de comparação e sincronização incorporados, embora seja mais limitado do que as ferramentas pagas, como os dados do Redgate.

Os dados do SQL comparam de Redgate (embora não livre) e também há SMO e a construídas em Função funcional.

Finalmente Wikipedia Tem uma lista bastante abrangente de software.

Como é um, você pode usar esta consulta para encontrar linhas diferentes nessas duas tabelas:

(SELECT * FROM TABLE_A
 MINUS
 SELECT * FROM TABLE_B)

 UNION ALL

(SELECT * FROM TABLE_B
 MINUS
 SELECT * FROM TABLE_A)

MINUS Comparará os registros de campo por campo, ele descartará os registros da primeira tabela para os quais há registro idêntico na segunda tabela. Isso funciona como este:

  • Primeiro MINUS obtém todos os registros de TABLE_A que não estão em TABLE_B
  • Segundo MINUS obtém todos os registros de TABLE_B que não estão em TABLE_A
  • A Union obtém todos os registros de ambas as tabelas para as quais não há registro correspondente em outra tabela.

Agora você pode inserir esses registros em alguma tabela de temperatura e depois fazer inserções/atualizações.

Dependendo das suas necessidades, você pode restringir a lista de campo para comparar.

Observe que você precisa de chave primária para que isso funcione.

Editar:
Ooops. O SQL Server não suporta MINUS operador. Estou trabalhando com o Oracle no ano passado e meio, então isso foi automático.

Você pode usar EXCEPT operador em vez disso. Veja este artigo: Exceto e intersect (transact-sql)

Editar 2:

Scherand's Comente:
Se ele realmente não pode se conectar da máquina local ao servidor ao vivo, ele pode simplesmente despejar TABLE_A e carregue -o no servidor. De uma maneira ou de outra, o objetivo é alterar os dados da tabela no servidor ao vivo.

Eu corri o mesmo problema que você - pesquisei uma ferramenta gratuita que compara dados de duas tabelas MS SQL - e não encontrei nada. Em seguida, criei um utilitário simples da linha de comando freeware. Compara dados de duas tabelas e cria INSERT/DELETE/UPDATE StatemENets para criar dados da tabela de destino iguais à fonte. Agora estou usando -o para comparação de dados e, como é totalmente gratuito, pode recomendar verificar isso em: Sourceforge.net - Ultradbc

Você pode usar um gerador de script de dados que cria script para as inserções e, em seguida, usar uma ferramenta de comparação de arquivos, como o WinMerge, para comparar os arquivos para encontrar as diferenças. Há um artigo sobre como gerar os scripts de dados no projeto de código: http://www.codeproject.com/kb/database/sqlinsertupdategerator.aspx

Tablediff funcionaria - é gratuito e vem com o SQL Serverhttp://msdn.microsoft.com/en-us/library/ms162843.aspx

Você também pode tentar usar o import and export data Fornecido pelo SQL Server 2008. É uma maneira bastante direta de copiar todos os dados de qualquer lugar para qualquer lugar. Eu faço a mesma coisa e funciona perfeitamente.

Você pode tentar o nosso Esquema Compare para SQL Server

Essa ferramenta não é gratuita (é shareware), mas você pode usar o teste de 30 dias de graça e também tem a oportunidade de obter uma licença gratuita para este produto - consulte o nosso Página de condições de licença grátis.

O que acontece se você:

  1. Copie devtablea para prod,
  2. suspender as dependências do ProdtableB
  3. renomear prodtable b para prodtableB1,
  4. renomear devtablea para prodtableb
  5. dependências de reimplementar em novo ProdtableB
  6. Teste o novo ProdtableB e depois exclua o nome de Old Prodtableb.

?

Ou se você tiver que ser mais respeitoso com o ProdtableB existente e seus valores de coluna de identidade em Match dev e Prod (mesmo que os valores não sejam contínuos) ...

declare @iLast int, @x int, @y int
select @iLast = (select MAX(id) from prodTableB)
set @x = 1
while @x <= @iLast
begin
  select @y = (select COUNT(*) from prodTableB where id = @x)
  if @y = 1
    begin
      update prodTableB set isFoo = (select isFoo from devTableA where id=@x
    end
  @x=@x+1
end

Você também pode dar uma olhada Os dados XSQL comparam. A versão SQL Express é gratuita e também há uma versão Lite que fará o truque para pequenos bancos de dados.

Uma boa ferramenta gratuita também é comparada com os dados de SSDT.

Isenção de responsabilidade: sou afiliado ao XSQL.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top