跨不同的SQL Server实例生成唯一标识列值

时间:2016-10-29 07:02:33

标签: sql-server sql-server-2008 identity-column

我有WinForm应用程序(C#)和Backed as SQL Server 2008,它在客户端位置脱机工作。目前,所有分支都是从单个位置进行管理,因此标识列值在分支中始终是唯一的。

现在,我希望从多个位置管理此应用程序,并且应该可以脱机以及在线工作。为了实现这一点,我们将SQL Server放在PUBLIC IP中,每个分支都将运行一个单独的本地SQL Server实例。数据将定期在本地和中央服务器之间同步。

这种方法对同步数据有好处,还是我能做的更好?

如果我采用上述方法,我将面临的问题是同步数据。表格结构存在问题,例如。我有一个表COURSES如下:

COURSES ( COURSE_ID (identity column), COURSE_NAME, COURSE_BRANCH_ID)

其中

  1. COURSE_ID是IDENTITY列
  2. COURSE_NAME代表标准
  3. 的名称
  4. COURSE_BRANCH_ID代表课程所在的分支。
  5. 现在每个SQL Server都会为COURSE_ID列生成自己的值,对于不同的服务器可能会相同。

    1. 唯一组合为COURSE_IDCOURSE_BRANCH_ID
    2. 在没有添加新的IDENTITY列的情况下,我是否可以使用COURSE_BRANCH_ID附加COURSE_ID
    3. 我想到的方法

      1. COURSE_ID列中删除身份
      2. 添加一个新列,即ID,它将是一个标识列。
      3. 现在,在COURCES表上插入后,写一个触发器,将COURSE_ID的值更新为Concate(COURSE_BRANCH_ID,ID)
      4.  convert(number(convert(varchar,COURSE_BRANCH_ID) + convert(varchar,ID))
        

        但这需要付出很多努力,因为我有大约19张表存在这样的问题。我有什么比这更好的事情吗?欢迎任何建议!谢谢!

1 个答案:

答案 0 :(得分:2)

有几种与此问题相关的方法。您提到的将分支ID连接到标识字段的那个。

你可以使用GUID,碰撞的可能性几乎为零。 或者您可以设置Identity Seed和Increment,以便每个分支具有不同的起始值,并且所有分支都以分支数递增。

例如,如果您有四个分支,那么在Branch1上您可以设置

ID INT IDENTITY(1, 4) NOT NULL -- IDs will be 1, 5, 9...etc.

在Branch2上

ID INT IDENTITY(2, 4) NOT NULL -- IDs will be 2, 6, 10 ...etc

在Branch3上

ID INT IDENTITY(3, 4) NOT NULL -- IDs will be 3, 7, 11 ...etc

在Branch4上

ID INT IDENTITY(4, 4) NOT NULL -- IDs will be 4, 8, 12 ...etc.