合并复制的注意事项

更新日期: 2006 年 4 月 14 日

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

  • 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。

ms151206.note(zh-cn,SQL.90).gif重要提示:
启用此内存优化可能会在同步期间降低合并代理的性能。仅当复制包含数兆字节数据的列时,才应使用此选项。

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

ms151206.note(zh-cn,SQL.90).gif注意:
建议使用 varchar(max)nvarchar(max)varbinary(max) 数据类型,而不要使用分别与他们对应的 textntextimage 数据类型。

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

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

  • 使用 bcp 实用工具或 BULK INSERT 命令的 FIRE_TRIGGERS 选项。此选项确保触发器像在通常的插入操作中一样被激发。有关详细信息,请参阅 bcp 实用工具BULK INSERT (Transact-SQL)
  • 执行大容量插入后,执行存储过程 sp_addtabletocontents。此过程将对源表中当前未包含的所有行的引用插入到系统表中。有关详细信息,请参阅 sp_addtabletocontents (Transact-SQL)

请参阅

概念

合并复制如何跟踪和枚举更改
合并复制概述
复制的向后兼容性
在复制拓扑中使用 SQL Server 的多个版本

其他资源

实现复制的注意事项

帮助和信息

获取 SQL Server 2005 帮助