复制支持对已发布对象的各种架构更改。 在Microsoft SQL Server 发布服务器上对相应已发布对象进行以下任一架构更改时,该更改默认传播到所有 SQL Server 订阅服务器:
修改表
如果启用了架构更改复制,并且拓扑包括 SQL Server 2005 或 SQL Server Compact 3.5 订阅服务器,则不应使用 ALTER TABLE SET LOCK ESCALATION。ALTER VIEW
ALTER PROCEDURE
修改函数
ALTER TRIGGER
ALTER TRIGGER 只能用于数据操作语言 [DML] 触发器,因为数据定义语言 [DDL] 触发器无法复制。
重要
必须使用 Transact-SQL 或 SQL Server 管理对象(SMO)对表进行架构更改。 在 SQL Server Management Studio 中更改架构时,Management Studio 会尝试删除并重新创建表。 无法删除已发布的对象,因此架构更改失败。
对于事务复制和合并复制,在分发代理或合并代理运行时,架构更改会以增量方式传播。 对于快照复制,在订阅服务器上应用新快照时,将传播架构更改。 在快照复制中,每次同步时,新的架构副本会被发送到订阅者。 因此,所有架构更改(而不仅仅是上面列出的更改)都会随每个同步一起自动传播到以前发布的对象。
有关在发布中添加和删除项目的信息,请参阅 “向现有发布添加项目”和“从现有发布中删除项目”。
复制架构更改
上面列出的方案更改会默认自动复制。 有关禁用架构更改复制的信息,请参阅有关复制架构更改的信息。
架构更改注意事项
复制架构更改时,请记住以下注意事项。
一般注意事项
架构更改受 Transact-SQL 施加的任何限制的约束。 例如,ALTER TABLE 不允许更改主键列。
仅对初始快照执行数据类型映射。 架构更改不会映射到以前版本的数据类型。 例如,如果在 SQL Server 2012 中使用了该语句
ALTER TABLE ADD datetime2 column,则数据类型不会为 SQL Server 2005 订阅者转换为nvarchar。 在某些情况下,发布服务器上会阻止架构更改。如果发布设置为允许传播架构更改,则会传播架构更改,无论发布中的文章的相关架构选项如何设置。 例如,如果选择不复制表项目的外键约束,但随后发出 ALTER TABLE 命令,向发布服务器上表添加外键,则外键将添加到订阅服务器上的表。 若要防止这种情况,请在发出 ALTER TABLE 命令之前禁用架构更改的传播。
架构更改只能在发布服务器上进行,而不是在订阅服务器上(包括重新发布订阅服务器)。 合并复制可防止订阅服务器上的架构更改。 事务复制不会阻止更改,但更改可能会导致复制失败。
更改传播到重新发布的订阅者时,默认情况下会进一步传播到它的下级订阅者。
如果架构更改引用了发布服务器上现有的对象或约束,但不在订阅服务器上存在的约束,则架构更改将在发布服务器上成功,但在订阅服务器上会失败。
添加外键时引用的订阅服务器上的所有对象必须与发布服务器上的相应对象具有相同的名称和所有者。
不支持显式添加、删除或更改索引。 支持为约束(如主键约束)隐式创建的索引。
不支持更改或删除复制管理的标识列。 有关标识列的自动管理的详细信息,请参阅 “复制标识列”。
不支持包含不确定函数的架构更改,因为它们可能会导致发布服务器和订阅服务器中的数据不同(称为非收敛)。 例如,如果在发布服务器上发出以下命令,
ALTER TABLE SalesOrderDetail ADD OrderDate DATETIME DEFAULT GETDATE()则当命令复制到订阅服务器并执行时,值会有所不同。 有关不确定函数的详细信息,请参阅 确定性函数和不确定函数。建议显式命名约束。 如果未显式命名约束,SQL Server 将为约束生成一个名称,并且这些名称在发布服务器和每个订阅服务器上将有所不同。 这可能会导致在复制架构更改期间出现问题。 例如,如果在发布服务器上删除列并删除依赖约束,复制将尝试在订阅服务器上删除该约束。 由于约束的名称不同,订阅服务器上的删除操作将失败。 如果同步因约束命名问题而失败,请在订阅服务器上手动删除该约束,然后重新运行合并代理。
如果表已发布进行复制,并且已生成发布快照,则无法将表中的列更改为 XML 数据类型。若要更改列,必须先删除复制。
在已发布的表上执行 DDL 时,不支持“读取未提交”这一隔离级别。
SET CONTEXT_INFO不应用于修改在已发布对象上执行架构更改的事务上下文。
添加列
若要向表中添加新列并在现有发布中包含该列,请执行 ALTER TABLE <Table> ADD <Column>。 默认情况下,该列将复制到所有订阅者。 该列必须允许 NULL 值或包含默认约束。 有关添加列的详细信息,请参阅本主题中的“合并复制”部分。
若要向表添加新列而不在现有发布中包含该列,请禁用架构变更的复制,然后执行 ALTER TABLE <表> ADD <列>。
若要在现有出版物中包含现有列,请使用 sp_articlecolumn(Transact-SQL)、 sp_mergearticlecolumn(Transact-SQL)或 “发布属性 - <发布> ”对话框。
有关详细信息,请参阅 “定义和修改列筛选器”。 这需要重新初始化订阅。
不支持向已发布表中添加身份列,因为当身份列复制到订阅者时,可能导致不收敛。 Publisher 的标识列中的值取决于受影响表的行以物理方式存储的顺序。 行可能以不同的方式存储在订阅服务器上;因此,同一行的标识列的值可能不同。
删除列
若要从现有发布中删除列,并从发布服务器的表中删除该列,请执行 ALTER TABLE <表> DROP <列>。 默认情况下,该列将从所有订阅者的表中删除。
若要从现有出版物中删除列,但保留发布服务器上的表中的列,请使用 sp_articlecolumn(Transact-SQL)、 sp_mergearticlecolumn(Transact-SQL)或 “发布属性 - <发布> ”对话框。
有关详细信息,请参阅 “定义和修改列筛选器”。 这需要生成新的快照。
要删除的列不能用于数据库中任何发布物的任何文章的筛选条件。
从已发布的文章中删除列时,请考虑到可能影响数据库列的任何约束、索引或属性。 例如:
不能从事务发布中的文章中删除主键中使用的列,因为这些列被复制使用。
不能从合并发布中的文章中删除rowguid列,也不能从支持更新订阅的事务发布中的文章中删除mstran_repl_version列,因为它们被复制功能使用。
索引的更改不会传播到订阅服务器: 如果在发布服务器上删除某列且删除了相关索引,则索引删除不会被复制。 您应先在订阅服务器上删除索引,然后再在发布服务器上删除列,以便列在从发布服务器复制到订阅服务器时能够成功删除。 如果同步因订阅服务器上的索引而失败,请手动删除索引,然后重新运行合并代理。
应显式命名约束以允许删除。 有关详细信息,请参阅本主题前面的“常规注意事项”部分。
事务复制
架构更改将传播到运行以前版本的 SQL Server 的订阅服务器,但 DDL 语句应仅包含订阅服务器上版本支持的语法。
如果订阅服务器重新发布数据,则唯一支持的架构更改是添加和删除列。 应在发布服务器上使用 sp_repladdcolumn(Transact-SQL) 和 sp_repldropcolumn (Transact-SQL) 而不是 ALTER TABLE DDL 语法进行这些更改。
架构更改不会复制到非 SQL Server 订阅服务器。
架构更改不会从非 SQL Server 发布服务器传播。
无法更改已作为表进行复制的索引视图。 可以更改作为索引视图复制的索引视图,但进行更改后,这些视图会从索引视图变成普通视图,而不是继续作为索引视图。
如果发布支持立即更新或排队更新订阅,则必须在进行架构更改之前暂停系统:已发布表上的所有活动必须在发布服务器和订阅服务器上停止,并且必须将挂起的数据更改传播到所有节点。 架构更改传播到所有节点后,活动可以在已发布的表上恢复。
如果发布物位于点对点拓扑中,必须在进行架构更改之前暂停系统。 有关详细信息,请参阅停止复制拓扑(复制 Transact-SQL 编程)。
在表中添加时间戳列并将时间戳映射到 binary(8) 会导致文档对所有活动订阅重新初始化。
合并复制
合并复制处理架构更改的方式由发布兼容性级别决定,并且取决于快照设置为原生模式(默认)还是字符模式:
若要复制架构更改,发布的兼容级别必须至少为 90RTM。 如果订阅服务器运行的 SQL Server 早期版本或兼容级别小于 90RTM,则可以使用 sp_repladdcolumn(Transact-SQL) 和 sp_repldropcolumn (Transact-SQL) 来添加和删除列。 但是,这些过程已弃用。
如果尝试向现有文章中添加一个在 SQL Server 2008 中引入的数据类型的列,SQL Server 会有以下行为:
100RTM,本机快照 100RTM,角色快照 所有其他兼容性级别 hierarchyid允许更改 阻止更改 阻止更改 geography和geometry允许更改 允许更改1 阻止更改 filestream允许变更 阻止更改 阻止更改 date、time、datetime2和datetimeoffset允许更改 允许更改1 阻止更改 1 个 SQL Server Compact 订阅服务器在订阅服务器上转换这些数据类型。
如果在应用架构更改时发生错误(例如因添加引用订阅方不可用表的外键而导致的错误),同步将会失败,必须重新初始化订阅。
如果对联接筛选器或参数化筛选器所涉及的列进行了架构更改,则必须重新初始化所有订阅并重新生成快照。
合并复制提供存储过程,用于在故障排除过程中跳过架构更改。 有关详细信息,请参阅sp_markpendingschemachange(Transact-SQL)和sp_enumeratependingschemachanges(Transact-SQL)。
另请参阅
ALTER TABLE (Transact-SQL)
ALTER VIEW (Transact-SQL)
ALTER PROCEDURE (Transact-SQL)
ALTER FUNCTION (Transact-SQL)
ALTER TRIGGER (Transact-SQL)
发布数据和数据库对象
重新生成自定义事务过程以反映架构更改