Eu tenho um programa em um computador e em um tablet. O programa usa o SQL Server Express para interagir com um banco de dados local (as mesmas informações em ambos) de um .MDF
arquivo. Portanto, se eu conectar o tablet ao PC, tenho dois .MDF
arquivos que desejo sincronizar.
Quero que ambos os usuários possam fazer alterações na versão em seus dispositivos, então quero obter os dois .MDF
arquivos e executar um script que os mescle.
O banco de dados tem uma chave primária GUID e uma DateTime
de quando foi alterado pela última vez, portanto, se houver conflitos, eu usaria apenas a versão mais recente.
Como devo fazer isso?
Ou, alternativamente, se estou fazendo isso da maneira errada, você poderia recomendar uma maneira alternativa de manter os bancos de dados dessas duas máquinas sincronizados sem uma conexão com a Internet?
Desde já, obrigado.
Sem uma conexão com a Internet, você estaria olhando para mesclagem ou replicação ponto a ponto. Nenhum dos quais pode ser implementado facilmente (google, parece que me lembro de ter visto uma solução alternativa em algum lugar) como você deseja com a edição Express. Se você tivesse uma edição padrão ou melhor, eu iria pessoalmente com Peer-To-Peer, pois nega a necessidade de uma coluna adicional por tabela e, como a mesclagem, inclui a resolução de conflitos. Esteja ciente de que, na minha opinião, a replicação é uma tecnologia bastante meticulosa e requer habilidades intermediárias de DBA para implementar e solucionar problemas com eficiência. Também esteja ciente de que, uma vez implementada a replicação, nenhuma transação pode ser limpa por um backup de log de transação ou ponto de verificação (dependendo do seu modelo de recuperação) até que tenha sido distribuída ao seu assinante. Dependendo da duração e do número de comandos entre as sincronizações, isso fará com que seu log de transações cresça e potencialmente preencha o disco. Obviamente, se o espaço em disco disponível ficar cheio, nenhuma nova transação poderá ser gravada/atualizada no banco de dados.
Com uma conexão com a Internet, eu definitivamente olharia para o Azure para fornecer a você um único banco de dados no qual ambos os dispositivos podem gravar.
Obviamente, você também pode obter e mesclar os dados por meio de scripts powershell, SSIS, C # ou obter uma licença de teste de comparação de dados RedGate e iniciar por meio de uma tarefa agendada do Windows (o SQL Server agent não está disponível no expresso) e fazer o trabalho que a replicação faria fora da caixa.
Em uma observação lateral, dependendo do seu uso, você poderá obter a licença do SQL Server da edição do desenvolvedor, que é igual à empresa.
Editar 1: ponto a ponto é um recurso exclusivo da empresa em 2008r2 e 2012, pelo menos, ao contrário da mesclagem que está disponível no padrão
Como conheço Powershell e VB muito melhor do que T-SQL, usaria uma dessas linguagens para extrair novos registros de cada banco de dados, percorrê-los e inseri-los no outro banco de dados. O script salvaria um arquivo que continha o carimbo de data/hora do último registro de cada banco de dados, que usaria na próxima vez que fosse executado para obter os registros mais recentes que aquela data. ...ou armazene o carimbo de data/hora ou o GUID da última linha sincronizada em algum lugar do banco de dados.
Sua terminologia de "mesclar .mdfs" pode confundir as pessoas aqui porque você não vai tentar ler os arquivos diretamente e mesclar as diferenças. Você só vai consultar novos registros em cada banco de dados e inseri-los no outro.
Você pode abordar isso por vários outros métodos - este é apenas um.
Dê uma olhada na tecnologia existente: replicação.
De acordo com a documentação (ênfase adicionada):
A maioria das ferramentas existentes, como Microsoft Sync e Merge-Replication, acabou parecendo muito exagerada e mais complicada do que valeria a pena.
Este é o meu script SQL para anexar os bancos de dados
Em seguida, para sincronizar os bancos de dados