Как объединить и синхронизировать файлы базы данных SQL Server?
Я создаю программу С# для таблиц Windows, которые синхронизируются с базой данных. Каждый из них будет иметь свою собственную локальную базу данных .MDF
SQL Server, с которой они взаимодействуют с использованием SQL Server Express.
Однако пользователи будут вынимать планшеты из интернет-соединения и вносить изменения. Затем, когда один подключается к сети, которая содержит "главную копию" базы данных, я хочу синхронизировать с ними эту базу данных .MDF
. Затем замените файлы базы данных компьютера и планшета на недавно синхронизированный.
У меня есть столбец uniqueidentifier
и datetime
, когда эта строка была изменена последним, поэтому, если бы были конфликты, я бы просто сделал последнее изменение.
Я прочитал некоторую литературу об этом, но мне бы хотелось увидеть явный пример или учебник о том, как это сделать. Я знаю, что я хочу Merge Replication и что Microsoft Sync Framework Кажется, что у меня есть функциональность, которую я хочу. Я просто пытаюсь его реализовать. Кроме того, не стесняйтесь рекомендовать другой инструмент для этого.
Спасибо заранее!
Ответы
Ответ 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