如何合并和同步SQL Server数据库文件?

时间:2015-03-09 20:37:13

标签: sql-server database synchronization microsoft-sync-framework merge-replication

我正在为与数据库同步的Windows平板电脑构建一个C#程序。他们每个人都有自己的本地.MDF SQL Server数据库,他们使用SQL Server Express进行交互。

然而,用户将从互联网连接中取出平板电脑并进行更改。然后,当一个人重新连接到包含DataBase的“主副本”的网络时,我想要将他们的.MDF数据库与它同步。然后用新同步的数据库替换计算机和平板电脑的数据库文件。

我有一个uniqueidentifier列,以及上次更改该行时的datetime,所以如果发生冲突,我会采取最近的更改。

我已经阅读了一些关于此的文献,但我很乐意看到一个明确的例子或如何做的教程。我知道我想要的是Merge Replication,并且Microsoft Sync Framework似乎具有我想要的功能。我正在努力实现它。或者,您可以随意推荐使用其他工具。

提前致谢!

4 个答案:

答案 0 :(得分:3)

我知道这不是一个很好的答案,但我确信这是通过Microsoft Sync Framework完成的。我还非常确定您可以轻松地从平板电脑同步数据库,即使它处于脱机状态。唯一的限制可能是缺少实时同步,您需要使用Azure服务,WebSockets,Apache MQ等等。抱歉没有更多信息,我将其发布为评论但没有足够的积分。

答案 1 :(得分:1)

如果它是Windows应用商店应用(WinRT),则必须使用Sync Framework Toolkit

如果是普通的Windows应用程序(WPF,WinForms等等),是的,您可以使用Sync Framework。

两者的想法是你的Windows应用程序使用本地数据库(SQL CE,LocalDB,SQLite等等)进行CRUD,当你有连接时偶尔会与中央服务器同步(通过WCF,如{{ 3}})

答案 2 :(得分:1)

MS Merge Replication很复杂,但根据您的使用情况,您不需要大部分功能。我会提前警告你,知道它有问题。它在企业中不太可靠。它有效,但它只需要宝宝坐着。如果您不介意服务电话,请继续。如果您需要一个强大的同步系统(针对您的用例),那么最好使用审计表来自行编辑。这并不困难;特别是因为你已经使用guids作为主键。您还可以使用顺序guids。随机guid会破坏您的聚簇索引,您的数据库性能将受到很大影响。如果您需要实施方面的帮助,请与我联系。我已成功为客户完成此操作。他们每天处理超过一百万条记录,没有一个问题。如果您仍想使用MS Merge Replication,我也可以为您执行此操作。

答案 3 :(得分:0)

微软同步和合并复制这样的大多数现有工具看起来似乎太过分,而且比它们的价值更麻烦。

这是我附加数据库的SQL脚本

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