如何管理标识列(复制 Transact-SQL 编程)

将订阅服务器插入操作复制回发布服务器时,必须对标识列进行管理,以避免在订阅服务器和发布服务器上分配相同的标识值。复制可自动管理标识范围,或者您可以选择手动处理标识范围管理。创建项目时,可使用复制存储过程来指定标识范围管理选项。有关由复制提供的标识范围管理选项的信息,请参阅复制标识列

注意注意

在多个发布中发布表时,必须为这些发布指定相同的标识范围管理选项。有关详细信息,请参阅发布数据和数据库对象中的“在多个发布中发布表”。

定义事务发布的项目时启用自动标识范围管理

  • 在发布服务器上,对发布数据库执行 sp_addarticle。如果要发布的源表具有标识列,则在为 @threshold 分配新标识范围之前,应将 @identityrangemanagementoption 的值指定为 auto,指定分配给发布服务器的标识值范围 @pub_identity_range,指定分配给每个订阅服务器的标识值范围 @identity_range,并指定所使用的总标识值的百分比。有关如何定义项目的详细信息,请参阅如何定义项目(复制 Transact-SQL 编程)

    注意注意

    确保标识列的数据类型足够大,从而能够支持分配到所有订阅服务器的标识总范围。

定义事务发布的项目时禁用自动标识范围管理

  1. 在发布服务器上,对发布数据库执行 sp_addarticle。将 @identityrangemanagementoption 的值指定为 manual。有关如何定义项目的详细信息,请参阅如何定义项目(复制 Transact-SQL 编程)

  2. 将范围分配到订阅服务器上的标识项目列,以避免在更新订阅服务器时产生冲突。有关详细信息,请参阅复制标识列主题中的“为手动标识范围管理分配范围”部分。

定义合并发布的项目时启用自动标识范围管理

  • 在发布服务器上,对发布数据库执行 sp_addmergearticle。如果要发布的源表具有标识列,则在为 @threshold 分配新标识范围之前,应将 @identityrangemanagementoption 的值指定为 auto,指定为分配给服务器订阅的标识值范围 @pub_identity_range,指定为分配给发布服务器和每个客户端订阅的标识值范围 @identity_range,并指定所使用的总标识值的百分比。有关何时分配新标识范围的详细信息,请参阅复制标识列主题中的“分配标识范围”。有关如何定义项目的详细信息,请参阅如何定义项目(复制 Transact-SQL 编程)

    注意注意

    确保标识列的数据类型足够大,从而能够支持分配到所有订阅服务器(尤其是具有服务器订阅的订阅服务器)的标识总范围。

定义合并发布的项目时禁用自动标识范围管理

  1. 在发布服务器上,对发布数据库执行 sp_addmergearticle。为 @identityrangemanagementoption 指定下列值之一:

    • manual - 必须手动分配标识范围以更新订阅服务器。

    • none - 不将发布服务器上的标识列定义为订阅服务器上的标识列。

    有关如何定义项目的详细信息,请参阅如何定义项目(复制 Transact-SQL 编程)

  2. 将范围分配到订阅服务器上的标识项目列,以避免在更新订阅服务器时产生冲突。

为快照发布或事务发布中现有的项目更改自动标识范围管理设置

  1. 在发布服务器上,对发布数据库执行 sp_helparticle,并注意结果集中 identityrangemanagementoption 的值。如果该值为 0,则未启用自动标识范围管理。

  2. 如果结果集中 identityrangemanagementoption 的值为 1,则按下面的方法更改设置:

    • 若要更改已分配的标识范围,请在发布服务器上对发布数据库执行 sp_changearticle。将 @property 的值指定为 identity_rangepub_identity_range,并为**@value** 指定新范围值。

    • 若要更改用于分配新范围的阈值,在发布服务器上对发布数据库执行 sp_changearticle。将 @property 的值指定为 threshold,并为 @value 指定新阈值。

为合并发布中的现有项目更改自动标识范围管理设置

  1. 在发布服务器上,对发布数据库执行 sp_helpmergearticle,并注意结果集中 identity_support 的值。如果该值为 0,则未启用自动标识范围管理。

  2. 如果结果集中 identity_support 的值为 1,则按下面的方法更改设置:

    • 若要更改已分配的标识范围,在发布服务器上对发布数据库执行 sp_changemergearticle。将 @property 的值指定为 identity_rangepub_identity_range,并为**@value** 指定新范围值。

    • 若要更改用于分配新范围的阈值,在发布服务器上对发布数据库执行 sp_changemergearticle。将 @property 的值指定为 threshold,并为 @value 指定新阈值。有关何时分配新标识范围的详细信息,请参阅复制标识列主题中的“分配标识范围”。

    • 若要禁用自动标识范围管理,在发布服务器上对发布数据库执行 sp_changemergearticle。将 @property 的值指定为 identityrangemanagementoption,并将 @value 的值指定为 manualnone