对发布数据库进行架构更改
更新日期: 2006 年 4 月 14 日
复制支持对已发布对象进行多种架构更改。对 Microsoft SQL Server 发布服务器中相应的已发布对象进行以下任何架构更改时,默认情况下更改都将传播到所有 SQL Server 订阅服务器:
- ALTER TABLE
- ALTER VIEW
- ALTER PROCEDURE
- ALTER FUNCTION
- ALTER TRIGGER(ALTER TRIGGER 只能用于数据操作语言 [DML] 触发器,因为无法复制数据定义语言 [DDL] 触发器。)
重要提示: |
---|
对表进行架构更改时必须使用 Transact-SQL 或 SQL Server 管理对象 (SMO)。在 SQL Server Management Studio 中进行架构更改时,Management Studio 将尝试删除并重新创建表。因为无法删除已发布的对象,所以架构更改失败。 |
对于事务性复制和合并复制,当分发代理或合并代理运行时,将增量传播架构更改。对于快照复制,将在订阅服务器中应用新快照时传播架构更改。在快照复制中,每次发生同步时,都将架构的一个新副本发送到订阅服务器。因此,每次同步时都自动传播对以前发布的对象的所有架构更改(而不只是上面列出的那些)。
有关在发布中添加和移除项目的信息,请参阅向现有发布添加项目和从中删除项目。
复制架构更改
默认情况下会复制上面列出的架构更改。有关禁用复制架构更改的信息,请参阅下列主题:
- SQL Server Management Studio: 如何复制架构更改 (SQL Server Management Studio)
- 复制 Transact-SQL 编程:How to: Replicate Schema Changes (Replication Transact-SQL Programming)
架构更改的注意事项
复制架构更改时,请牢记下列注意事项:
一般注意事项
- 架构更改需遵守 Transact-SQL 规定的所有限制。例如,ALTER TABLE 不允许对主键列执行 ALTER 语句。
- 如果发布被设置为允许传播架构更改,则不论为发布中的项目设置的相关架构选项是什么,都会传播架构更改。例如,如果选择不复制某个表项目的外键约束,但随后又发出 ALTER TABLE 命令,将外键添加到发布服务器中的表中,那么外键将被添加到订阅服务器中的表中。若要防止出现这种情况,请在发出 ALTER TABLE 命令之前禁用架构更改的传播。
- 架构更改只应在发布服务器中进行,不应在订阅服务器中(包括重新发布订阅服务器)上进行。合并复制禁止在订阅服务器中进行架构更改。事务性复制虽然不禁止更改,但更改可能会导致复制失败。
- 传播到重新发布订阅服务器的更改默认情况下会传播到它的订阅服务器。
- 如果架构更改引用存在于发布服务器中而不存在于订阅服务器中的对象或约束,则架构更改将在发布服务器中成功,但在订阅服务器上失败。
- 添加外键时引用的订阅服务器中的所有对象必须与发布服务器中的相应对象具有相同的名称和所有者。
- 不支持显式添加、删除或更改索引。支持为约束(如主键约束)隐式创建的索引。
- 不支持更改或删除由复制管理的标识列。有关自动管理标识列的详细信息,请参阅复制标识列。
- 不支持包含不确定性函数的架构更改,因为它们可能会导致发布服务器和订阅服务器中的数据不同(称为无法收敛)。例如,如果在发布服务器发出以下命令:
ALTER TABLE SalesOrderDetail ADD OrderDate DATETIME DEFAULT GETDATE()
,则将此命令复制到订阅服务器并执行时,会得到不同的值。有关不确定性函数的详细信息,请参阅确定性函数和不确定性函数。 - 建议显式命名约束。如果不显式命名约束,SQL Server 将为约束生成名称,并且这些名称在发布服务器和每个订阅服务器中都不同。这在复制架构更改时会引发问题。例如,如果在发布服务器中删除一列并删除了一个相关约束,则复制将尝试在订阅服务器中删除该约束。由于约束名称不同,因此在订阅服务器上的删除将失败。如果由于约束命名问题而导致同步失败,可以在订阅服务器中手动删除约束然后重新运行合并代理。
- 如果为复制而发布表,则在已生成发布快照的情况下,无法将该表中的列更改为 XML 数据类型(可以在生成快照之前更改列)。若要更改列,必须首先删除复制。有关详细信息,请参阅删除复制。
添加列
- 若要将一个新列添加到表中并在现有发布中包括此列,请执行 ALTER TABLE <Table> ADD <Column>。默认情况下,此列然后将被复制到所有订阅服务器中。此列必须允许 NULL 值或包含默认约束。
- 若要将一个新列添加到表中但不在现有发布中包括此列,请禁用架构更改复制,然后执行 ALTER TABLE <Table> ADD <Column>。
- 若要在现有发布中包括现有列,请使用 sp_articlecolumn (Transact-SQL)、sp_mergearticlecolumn (Transact-SQL) 或**“发布属性 - <发布>”**对话框。
有关详细信息,请参阅How to: Define and Modify a Column Filter (Replication Transact-SQL Programming)和如何定义和修改列筛选器 (SQL Server Management Studio)。这要求重新初始化订阅。 - 不支持向已发布的表中添加标识列,因为将列复制到订阅服务器中时,可能会导致无法收敛。发布服务器中的标识列中的值取决于受影响表中的行的物理存储顺序。行在订阅服务器中的存储顺序可能会有所不同;因此对于相同的行,标识列的值可能会不同。
删除列
- 若要从现有发布中删除列并从发布服务器中的表中删除该列,请执行 ALTER TABLE <Table> DROP <Column>。默认情况下,该列然后将从所有订阅服务器中的表中删除。
- 若要从现有发布中删除列但在发布服务器中的表中保留该列,请使用sp_articlecolumn (Transact-SQL)、sp_mergearticlecolumn (Transact-SQL) 或**“发布属性 - <发布>”**对话框。
有关详细信息,请参阅How to: Define and Modify a Column Filter (Replication Transact-SQL Programming)和如何定义和修改列筛选器 (SQL Server Management Studio)。这要求生成一个新的快照。 - 要删除的列不能用于数据库中任何发布的任何项目的筛选子句中。
- 从已发布项目中删除列时,请考虑任何可能影响数据库的列的约束、索引或属性。例如:
- 无法从事务性发布的项目中删除主键中使用的列,因为这些列由复制使用。
- 无法从合并发布的项目中删除 rowguid 列,也不能从支持更新订阅的事务性发布的项目中删除 mstran_repl_version 列,因为这些列由复制使用。
- 索引更改不会传播到订阅服务器:如果在发布服务器上删除一列并删除一个相关索引,则不会复制索引删除。在发布服务器上删除列之前,应在订阅服务器中删除索引,这样从发布服务器向订阅服务器复制列删除时才会成功。如果由于订阅服务器中的索引而导致同步失败,可以手动删除索引然后重新运行合并代理。
- 约束应显式命名,以允许删除。有关详细信息,请参阅本主题后面的“一般注意事项”部分。
事务性复制
- 架构更改传播到运行 SQL Server 早期版本的订阅服务器中,但 DDL 语句只应包含订阅服务器中的 SQL Server 版本支持的语法。
如果订阅服务器重新发布数据,唯一支持的架构更改是添加和删除列。应在发布服务器中使用 sp_repladdcolumn (Transact-SQL) 和 sp_repldropcolumn (Transact-SQL) 进行这些更改,而不要使用 ALTER TABLE DDL 语法。 - 传播到非 SQL Server 订阅服务器中的架构更改将导致订阅服务器重新初始化。
- 不会从非 SQL Server 发布服务器中传播架构更改。
- 无法更改按表复制的索引视图。可以更改按索引视图复制的索引视图,但更改它们将导致它们成为普通视图,而不是索引视图。
- 如果发布支持立即更新订阅或排队更新订阅,则必须在进行架构更改前停止系统:必须在发布服务器和订阅服务器中停止已发布的表上的所有活动,还必须将挂起的数据更改传播到所有节点。架构更改传播到所有节点后,可以在已发布的表上恢复活动。
- 如果发布在对等拓扑中,必须在进行架构更改前停止系统。有关详细信息,请参阅How to: Quiesce a Replication Topology (Replication Transact-SQL Programming)。
- 将一个时间戳列添加到表中并将时间戳映射到 binary(8) 将导致重新初始化所有活动订阅的项目。
合并复制
- 若要复制架构更改,发布兼容级别必须至少是 90RTM。有关详细信息,请参阅主题在复制拓扑中使用 SQL Server 的多个版本中的“合并发布的兼容级别”部分。如果订阅服务器运行 SQL Server 的早期版本或者兼容级别小于 90RTM,仍可以使用 sp_repladdcolumn (Transact-SQL) 和 sp_repldropcolumn (Transact-SQL) 添加和删除列。
- 如果在应用架构更改时发生错误(如由于添加的外键引用订阅服务器中不可用的表而导致错误),同步将失败,必须重新初始化订阅。
- 如果在联接筛选器或参数化筛选器中涉及的列上进行架构更改,必须重新初始化所有订阅并重新生成快照。
- 合并复制提供了在排除故障期间跳过架构更改的存储过程。有关详细信息,请参阅 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)
帮助和信息
更改历史记录
版本 | 历史记录 |
---|---|
2006 年 4 月 14 日 |
|