Подтвердить что ты не робот

Как объединить и синхронизировать файлы базы данных SQL Server?

Я создаю программу С# для таблиц Windows, которые синхронизируются с базой данных. Каждый из них будет иметь свою собственную локальную базу данных .MDF SQL Server, с которой они взаимодействуют с использованием SQL Server Express.

Однако пользователи будут вынимать планшеты из интернет-соединения и вносить изменения. Затем, когда один подключается к сети, которая содержит "главную копию" базы данных, я хочу синхронизировать с ними эту базу данных .MDF. Затем замените файлы базы данных компьютера и планшета на недавно синхронизированный.

У меня есть столбец uniqueidentifier и datetime, когда эта строка была изменена последним, поэтому, если бы были конфликты, я бы просто сделал последнее изменение.

Я прочитал некоторую литературу об этом, но мне бы хотелось увидеть явный пример или учебник о том, как это сделать. Я знаю, что я хочу Merge Replication и что Microsoft Sync Framework Кажется, что у меня есть функциональность, которую я хочу. Я просто пытаюсь его реализовать. Кроме того, не стесняйтесь рекомендовать другой инструмент для этого.

Спасибо заранее!

4b9b3361

Ответ 1

Я знаю, что это не очень ответ, но я уверен, что это делается с Microsoft Sync Framework. Я также уверен, что вы можете легко синхронизировать db с планшета, даже если он отключен. Единственным ограничением может быть отсутствие синхронизации в реальном времени, для которой вам необходимо использовать Azure-сервисы, WebSockets, Apache MQ или что-то еще. Извиняюсь из-за отсутствия дополнительной информации, я бы опубликовал ее как комментарий, но не имел достаточного количества баллов.

Ответ 2

если это приложение для Windows Store (WinRT), вы должны использовать Инструмент Sync Framework Toolkit.

если обычное приложение Windows (WPF, WinForms и т.д.), да, вы можете использовать Sync Framework.

Идея для обоих заключается в том, что ваше приложение Windows использует локальную базу данных (SQL CE, LocalDB, SQLite и т.д.) для CRUD, которую вы иногда синхронизируете с центральным сервером при подключении (через WCF, например this)

Ответ 3

Репликация MS Merge сложна, но на основе вашего использования вам не потребуется большая часть функций. Я заранее предостерег вас, что у него есть проблемы. Он не очень надежный в Enterprise. Это работает, но это просто требует детского сидения. Если вы не возражаете против вызовов службы, продолжайте. Если вам нужна надежная система синхронизации (для вашего варианта использования), вам лучше сворачивать свои собственные, используя таблицы аудита. Это не так сложно сделать; тем более, что вы уже используете гиды в качестве основных ключей. Вам также будет полезно использовать последовательные контуры. Случайные подсказки будут фрагментировать ваш кластерный индекс, и производительность вашей базы данных сильно пострадает. Если вам нужна помощь в реализации, обратитесь ко мне. Я успешно сделал это для клиента. Они обрабатывают более миллиона записей в день без единой проблемы. Если вы все еще хотите использовать репликацию MS Merge, я тоже могу это сделать для вас.

Ответ 4

Большинство существующих инструментов, таких как Microsoft Sync и Merge-Replication, перестали казаться слишком чрезмерными и были более сложными, чем это было бы полезно.

Это мой SQL Script для прикрепления баз данных

CREATE DATABASE LocalDatabase  
ON (Filename = 'C:\ProgramData\Clayton\Database.mdf')
   , (Filename = 'C:\ProgramData\Clayton\Database_log.ldf') 
FOR ATTACH;
GO

EXEC sp_addlinkedserver @server='Server'

Затем для синхронизации баз данных

-- update the client from the master 
MERGE [LocalDatabase].[dbo].[tableName] trgt
using [Server].[ServerDatabase].[dbo].[tableName] src

ON trgt.id = src.id 

WHEN matched AND trgt.lastmodified <= src.lastmodified THEN 
  -- if the master has a row newer than the client
  -- update the client                       
  UPDATE SET trgt.[allColumns]      = src.[allColumns],
             trgt.[id]              = src.[id], 
             trgt.[lastmodified]    = src.[lastmodified] 

-- delete any rows added by a client 
WHEN NOT matched BY source 
THEN 
  DELETE 

-- insert any rows added by the master 
WHEN NOT matched BY target 
THEN 
  INSERT ( [allColumns], 
           [id], 
           [lastmodified]) 
  VALUES (src. [allColumns], 
          src.[id], 
          src.[lastmodified]); 


-- now we update the master from the client
-- Note:
-- because the serverDB is a linked server 
-- we can't use another MERGE statement, otherwise
-- we get the error: "The target of a MERGE statement 
-- cannot be a remote table, a remote view, or a view over remote tables."

UPDATE
    serverDB

SET 
    [allColumns]        = [localDB].[allColumns],
    [id]                = [localDB].[id], 
    [lastmodified]      = [localDB].[lastmodified] 

FROM 
     [Server].[ServerDatabase].[dbo].[tableName] serverDB

INNER JOIN
     [LocalDatabase].[dbo].[tableName] localDB

-- update where the id is the same but the client is newer than the master

ON serverDB.id = localDB.id 
       AND localDB.lastmodified >= serverDB.lastmodified