【问题标题】:SQL Server 2008 Sync - How to reinsert conflicting pk rows with new primary keySQL Server 2008 同步 - 如何使用新的主键重新插入冲突的 pk 行
【发布时间】:2009-11-26 09:28:20
【问题描述】:

有人可以指出我使用 Sync Framework 在 c# .net 中处理 PK 冲突错误的正确方向吗?

我正在尝试在 sql server 2008 和本地数据缓存数据库 (.sdf) 之间进行同步,并且希望保留在服务器和客户端中都存在冲突的行,并且不允许服务器或客户端获胜?

当我将新行插入到具有相同 PK id 的服务器和客户端时,我得到一个 pk 冲突错误。

任何建议将不胜感激。

谢谢

【问题讨论】:

  • 您离可行的解决方案有多近?您是否考虑过使用 Microsoft Sync Framework。这里面有一个很好的冲突解决系统。
  • 我正在使用同步框架,但是对于 PK 冲突 (ClientInsertServerInsert),没有选项可以指定将两行都接受到两个表中(据我所知)。
  • 当你有一个双方的冲突时,你要么需要写日志进行和解;要么或通过强制写入更改密钥
  • 我现在已经解决了这个问题,方法是使用 PK 的 GUID 而不是自动递增的 int。这保证了服务器或任何客户端插入的每一行都是唯一的。我知道有一些缺点,例如额外的存储空间和搜索所需的时间,但这是我愿意接受的(我将过滤客户端获取的数据,这将有助于提高性能)。

标签: .net sql-server sql-server-2005 sql-server-2008 synchronization


【解决方案1】:

这类问题的一般原则是为自然键设置一列。这个想法是主键唯一标识表中的一行,而自然键唯一标识该行描述的对象。如果发生冲突,让服务器获胜并在客户端插入新行。将发布新的PK,但自然密钥保持不变。稍后通过自然键排序很容易找到这些行。

【讨论】:

    【解决方案2】:

    这可以通过使用 PK 的 GUID 而不是自动递增的 int 来解决。

    这保证了服务器或任何客户端插入的每一行都是唯一的并且工作得很好。

    存在一些缺点,例如额外的存储空间和搜索所需的时间等,但这是我愿意接受的(我将过滤客户端获取的数据,这将有助于提高性能)。

    感谢大家的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-05
      • 1970-01-01
      • 2017-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多