合并复制的注意事项

合并复制具有以下注意事项:

  • uniqueidentifier 列添加到已发布表中。

  • timestamp 列。

  • 大型对象 (LOB) 数据类型。

  • 向已发布表中大容量插入数据。

  • 发布兼容级别。 有关详细信息,请参阅在复制拓扑中使用 SQL Server 的多个版本中的“合并发布的兼容级别”部分。

添加 uniqueidentifier 列

在合并复制过程中,合并复制使用全局唯一标识符 (GUID) 列标识每行。 如果已发布表中没有具有 ROWGUIDCOL 属性和唯一索引的 uniqueidentifier 列,复制将添加这种列。 请确保任何引用已发布表的 SELECT 和 INSERT 语句都使用列列表。 如果表已不再发布且复制添加了该列,则删除此列;如果该列已存在,则不删除。

timestamp 列

合并复制支持 timestamp 列。 复制 timestamp 列,但不复制 timestamp 的文字值。 快照应用于订阅服务器时,timestamp 值将重新生成。 因为 timestamp 值是在订阅服务器上重新生成的,所以在执行项目验证时,将筛选掉 timestamp 列。

大型对象 (LOB) 数据类型

如果已发布表中包含任何 LOB,建议您将 sp_addmergearticle (Transact-SQL) 中的 @stream_blob_columns 参数的值指定为 TRUE。 如果未指定为 TRUE,则必须在发布服务器的内存中生成整个 LOB,如果该 LOB 非常大,就可能导致发布服务器用尽 RAM。

重要说明重要提示

启用此内存优化可能会在同步期间降低合并代理的性能。 仅当复制包含数兆字节数据的列时,才应使用此选项。

只有使用 UPDATE 语句显式更新 text、ntext 和 image 列后,才能复制对这些列的更新: 更新导致激发某个更新元数据的触发器,从而确保事务传播到其他订阅服务器。 仅使用 WRITETEXT 和 UPDATETEXT 操作不能将更改传播到其他站点。 如果应用程序使用 WRITETEXT 和 UPDATETEXT 更新 text 或 ntext 列,请在同一事务中的 WRITETEXT 或 UPDATETEXT 操作后显式添加一条虚 UPDATE 语句来激发触发器,从而保证更改传播到其他站点。 有关这些数据类型的详细信息,请参阅 ntext、text 和 image (Transact-SQL)

注意注意

建议使用 varchar(max)、nvarchar(max) 和 varbinary(max) 数据类型,而不要使用分别与他们对应的 text、ntext 和 image 数据类型。

向已发布表中大容量插入数据

合并复制使用触发器和系统表跟踪对已发布表的更改。 如果使用 bcp 实用工具或 BULK INSERT 命令执行数据的大容量插入,则在默认情况下不会激发触发器。 如果触发器不激发,则插入不会被跟踪,而且也不会传播到其他节点。 若要保证跟踪更改,建议您在执行大容量插入时使用下列方法之一:

  • 使用 bcp 实用工具或 BULK INSERT 命令的 FIRE_TRIGGERS 选项。 此选项确保触发器像在通常的插入操作中一样被激发。 有关详细信息,请参阅 bcp 实用工具BULK INSERT (Transact-SQL)

  • 执行大容量插入后,执行存储过程 sp_addtabletocontents。 此过程将对源表中当前未包含的所有行的引用插入到系统表中。 有关详细信息,请参阅 sp_addtabletocontents (Transact-SQL)