Suponha esta estrutura de banco de dados:
--On main server(server)
TicketRequest (id, date, count, start, end/*,and some other columns*/)
Ticket (id, reqId, blockedDate, usedDate, userId/*,and some other columns*/)
--and some other tables
--On linked server(gate)
--Just this table
Ticket (id, userId, blockedDate, usedDate)
A Ticket
pode usar no portão, então no portão só usedDate
pode mudar.
No servidor, um Ticket
pode ser bloqueado, excluído; ou após importar os dados do gate, defina seu arquivo usedDate
.
Quero sincronizá-los online.
Eu escrevi sp_server_export , sp_gate_import para transportar dados do servidor e sp_gate_export , sp_server_import para transportar dados do portão, para sincronizá-los por meio de um arquivo (um arquivo server_export vai para o portão e o arquivo server_import volta para o servidor).
Eu usei MERGE
e seu desempenho é muito bom! Agora, quando estou tentando encontrar uma solução para sincronizar o servidor com o portão, depois de algumas pesquisas, infelizmente, a Microsoft diz: MERGE
não está funcionando na tabela remota como destino!
Então, como posso sincronizar com uma transação do servidor?!
NOTA: Como nosso plano, a sincronização deve ser executada apenas a partir do servidor! O operador do portão não pode alterar o DB!
NOTA IMPORTANTE: Considere que a simultaneidade é minha primeira preocupação! Eu quero sincronizar enquanto um usuário pode excluir um Ticket
! Ou Ticket
pode bloquear ao mesmo tempo! Ou no portão um Ticket
pode usar!
ATUALIZAR :
Nossa lógica de sincronização é:
1 - excluir ingressos antigos (que retornaram com uma sincronização de arquivos e têm returnDate
e têm modificationDate >
um carimbo de data/hora de um mês depois para garantir a exclusão de ingressos usados do portão)
2 - atualização gate.ticket onde usedDate é null set blockDate = server.blockDate;
3 - insira novas linhas do servidor
4 - defina transferDate para ingressos transferidos para o portão (quero dizer ingressos novos/atualizados nas etapas 2 e 3)
5 - atualize server.Ticket.usedDate de gate.Ticket onde gate.Ticket.usedDate não é nulo. (isso enviará tickets usados do portão de volta ao servidor)
6 - insira um transferLog ( na tabela transferLog no servidor )
Você já considerou a replicação de mesclagem? Esta parece ser uma ótima solução para mim.
https://learn.microsoft.com/en-us/sql/relational-databases/replication/merge/merge-replication
Se você quiser usar
MERGE
para sincronizar a tabela no servidor remoto, mas não pode porque está no servidor remoto......você ainda deve ser capaz de usar instruções separadas
UPDATE
eINSERT
, para o mesmo efeito.Usando os mesmos critérios básicos do
MERGE
, você deve ser capaz de:UPDATE
todas as linhas que já existem; eINSERT
quaisquer linhas que ainda não existam.Fazer isso nessa ordem evita atualizar as linhas que você acabou de inserir.
MERGE
as operações executam as etapasINSERT
eUPDATE
separadamente na realidade, portanto, os problemas de simultaneidade não devem ser piores do que com oMERGE
.Resposta da wiki da comunidade