NOT FOR REPLICATION

使用 NOT FOR REPLICATION
Microsoft® SQL Server™ 2000 复制使用 NOT FOR REPLICATION 选项在分区环境中实现标识值范围。当用来自不同站点的行分区发布表时,NOT FOR REPLICATION 选项在事务或合并复制中特别有用。

当复制代理程序用任何登录连接到某个表时,该表上的所有 NOT FOR REPLICATION 选项都将被激活。设置该选项时,SQL Server 2000 在复制代理程序所添加的行上保留起始标识值,但是继续在其他用户所添加的行上增加标识值。当用户将某个新行添加到表时,标识值以通常的方式增加。当复制代理程序将该新行复制到订阅服务器时,在将该行插入到订阅服务器表中时不更改标识值。

例如,考虑这样的表,它包含从两个源插入的行:发布服务器 A 和发布服务器 B。通过将值从 1 增加到 1000 标识在发布服务器 A 上插入的行,通过将值从 1001 增加到 2000 标识在发布服务器 B 上插入的行。如果发布服务器 A 上的进程将行从本地插入到表中,则 SQL Server 指派第一行的值为 1,第二行的值为 2,依此类推。同样,如果发布服务器 B 上的进程将行从本地插入到表中,则指派第一行的值为 1001,第二行的值为 1002,依此类推。当将发布服务器 A 上的行复制到发布服务器 B 上时,标识值仍然是 1、2,依此类推,但将不重置发布服务器 B 上的本地种子值。

无论 IDENTITY 属性在复制中的作用如何,它本身不强制唯一性,而只插入下一个值。虽然可以使用 SET IDENTITY INSERT 提供显式值,但该函数不适合复制,因为它还重新赋值。NOT FOR REPLICATION 选项是专门为使用复制的应用程序创建的。例如,如果没有此选项,只要发布服务器 B(值为1001)中的第一行传播到发布服务器 A,则发布服务器 A 的下一个值将是 1002。NOT FOR REPLICATION 选项告诉 SQL Server 2000 当提供显式值时,复制进程获得一个弃权声明,并且不应重置本地值的种子值。每个使用此选项的发布服务器都获得相同的重新赋值弃权声明。

在复制可以处理标识属性之前,必须通过自定义存储过程对完整的列列表使用 INSERT、UPDATE 和 DELETE 语句。如果未使用完整的列列表,则将返回一个错误信息。

以下代码示例说明如何在每个发布服务器上的不同范围执行标识:

在发布服务器 A 上,从 1 开始以 1 递增。
CREATE TABLE authors ( COL1 INT IDENTITY (1, 1) NOT FOR REPLICATION PRIMARY KEY )

在发布服务器 B 上,从 1001 开始以 1 递增。
CREATE TABLE authors ( COL1 INT IDENTITY (1001, 1) NOT FOR REPLICATION PRIMARY KEY )

激活 NOT FOR REPLICATION 选项之后,从复制代理到发布服务器 A 的连接插入带有诸如 1, 2, 3, 4 值的行。这些值(即 1, 2, 3, 4)不做任何更改地复制到发布服务器 B。来自发布服务器 B 上的复制代理程序的连接获得值 1001、1002、1003 和 1004。这些值将不做任何更改地复制到 A。当分发或合并所有数据后,两个发布服务器都有值 1、2、3、4、1001、1002、1003 和 1004。下一个在发布服务器 A 上本地插入的值是 5。下一个在发布服务器 B 上本地插入的值是 1005。

建议始终将 NOT FOR REPLICATION 选项与 CHECK 约束一起使用,以确保指派的标识值在允许范围内。例如:

CREATE TABLE sales
(sale_id INT IDENTITY(100001,1)
    NOT FOR REPLICATION
    CHECK NOT FOR REPLICATION (sale_id <= 200000),
sales_region CHAR(2),
CONSTRAINT id_pk PRIMARY KEY (sale_id)
)

即使用 SET IDENTITY INSERT,所有本地插入的值也必须遵守范围。但是,复制进程仍然免于检查。


说明  如果使用的是带即时更新订阅服务器选项的事务复制,则不要使用 IDENTITY NOT FOR REPLICATION 设计。相反,只在发布服务器上创建 IDENTITY 属性,并使订阅服务器只使用基本数据类型(例如 int)。这样一来,就始终在发布服务器上生成下一个标识值。
posted @ 2009-12-28 10:42  RobotTech  阅读(3822)  评论(0编辑  收藏  举报