合并复制的注意事项
更新日期: 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。
重要提示: |
---|
启用此内存优化可能会在同步期间降低合并代理的性能。仅当复制包含数兆字节数据的列时,才应使用此选项。 |
只有使用 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)。
请参阅
概念
合并复制如何跟踪和枚举更改
合并复制概述
复制的向后兼容性
在复制拓扑中使用 SQL Server 的多个版本