发布数据库上的架构更改

发布数据库上的架构更改
Microsoft? SQL Server? 2000 支持对现有发布数据库进行一般的架构更改。可以向某个已发布的表中添加列和从中除去列,而无需除去和重新创建引用此表的发布和订阅。

架构更改可以在快照复制、事务复制和合并复制期间进行复制。列的添加和删除在表级别执行并传播到从该表接收数据的所有订阅服务器。对于快照复制,当在订阅服务器上重新应用新建快照时,将传播架构更改。对于事务复制和合并复制,当分发代理程序或合并代理程序运行时,将增量传播架构更改。

 

重要  对已发布表的架构更改必须通过 SQL Server 企业管理器中的复制发布属性对话框或复制存储过程进行。不要在诸如 SQL Server 查询分析器的工具中使用 SQL ALTER TABLE 语句或使用 SQL Server 企业管理器可视化数据库工具进行已发布表的架构更改。使用这些工具对已发布表进行的更改不能传播到订阅服务器。


建议在更改架构或使用 sp_mergecleanupmetadata 后备份发布数据库。这将确保在发布服务器发生故障时将发布数据库恢复到正确的状态。

添加列
可以将列添加到:

一个或多个发布中的项目。
此时,添加一列并立即将架构更改应用于一个或多个现有发布,此更改将传播到这些发布的订阅服务器。

基础表,而不将其包括在已发布的项目中。
您也许要更改基础表而非已发布项目的架构。例如,如果要添加包括敏感数据或专有数据的列,那么这个选择可允许进行架构更改而不会将信息传播到订阅服务器。它也可使您推迟将新列加入到已发布项目中的时间。

已发布的项目,使用基础表中现有的列。
每当将一个列添加到事务发布中时,适当的 ALTER TABLE 语句(或者 sp_repladdcolumn 或 sp_repldropcolumn,如果在订阅服务器上重新发布表的话)将传播到订阅服务器并在其上运行,以在订阅数据库上完成架构更改。

订阅的重新初始化只有在将现有列添加到已发布项目时才有必要进行。在创建新列并立即将其添加到已发布项目时,不需要进行重新初始化。这是因为在下次同步处理时,合并代理程序会在每个受影响的订阅服务器上重新执行 sp_repladdcolumn 存储过程(或在除去某列时执行 sp_repldropcolumn),其中包括所有原始语法。如果目的表未在订阅服务器上重新发布,则分发代理程序重新执行 ALTER TABLE 语句,否则在下次同步处理时在每个受影响的订阅服务器上重新执行 sp_repladdcolumn 或 sp_repldropcolumn,其中包括所有原始语法。

当向正在发布的表添加一个列,但不包括发布中的列时,不需要进一步的操作。但是,如果以后将列添加到发布,则发布的订阅将需要为所有类型的发布进行重新初始化。若要避免重新初始化订阅,请立即将此列添加到已发布项目,而不要等到以后将其添加到现有项目。

补充考虑事项
在通过复制用户界面或复制存储过程定义新列时,必须执行下列操作之一:

允许新列使用 NULL 值。


指定列的默认值。
将项目添加到合并发布中
当将项目添加到合并发布中时,对于将要传播到订阅服务器的新项目架构和数据,不要求重新初始化现有订阅。当将项目添加到有活动订阅的合并发布中时,必须在添加项目后及同步任何订阅服务器之前运行快照代理程序。如果发布已有订阅,则订阅服务器将在下一次同步时将接收到基于该快照的新项目的架构和数据。然后合并代理程序将同步订阅的所有数据更改。

当将项目添加到有活动订阅的发布中时,可以用子集筛选子句筛选项目而不需要重新初始化订阅。然而,如果没有重新初始化所有对发布的订阅,则无法将任何联接筛选字句添加到有活动订阅的发布中。

当使用 SQL Server 企业管理器中的"发布属性"添加项目时,将收到一条信息,指出生成发布的新快照之前订阅无法同步。当应用更改时,建议立即运行快照代理程序。

如果使用存储过程添加项目,必须通过设置 sp_addmergearticle 中的 @force_invalidate_snapshot=1,授权将项目添加到发布中。然后应该立即运行发布的快照代理程序。

不论使用 SQL Server 企业管理器中的"发布属性"还是存储过程,都可以推迟运行快照代理程序,但是在对已更改发布的任何现有订阅可以同步并接收新架构和新数据之前,必须运行快照代理程序。

除去列
在从已发布项目中除去列时,请考虑任何可能影响数据库的列的约束或属性。

不能除去带有主键或唯一约束的列,并且不能除去复制代理程序所使用的 UNIQUEIDENTIFIER(或 ROWGUIDCOL)列。


要除去的列不能用于数据库中任何发布的任何项目的筛选子句中。


其它类型的约束(如外键和检查约束)不会阻止除去列。但是对于大多数约束来说,会有警告消息提示您,标识列上的约束并要求在除去此列之前进行验证。在确认操作后,SQL Server 2000 除去此列上的所有约束,然后除去此列。


说明  对于除去的列,复制不会就与其有关的每种可能的相关性提出警告。如果您考虑要除去的列由另一列上的约束引用,那么 SQL Server 2000 不会通知此相关性,并允许除去此列。因此,您应当透彻理解基础数据库架构,并在除去已发布列时慎重行事。


如何应用架构更改
在合并复制的发布表上添加或除去一个列以后,下次对订阅进行同步处理时架构更改将传播到订阅服务器。在事务复制中,下次日志读取器代理程序和分发代理程序运行时,架构更改将传播到订阅服务器。当用并发的快照处理添加新项目或重新初始化现有项目到事务发布中,且当快照代理程序启动时,分发代理程序停止等待同步过程,包括快照代理程序和日志读取器代理运行的时间。完成同步后,分发代理程序将继续运行。

默认情况下,在事务复制中,自定义存储过程将在订阅服务器上自动重新创建。在默认情况下对于所有类型的复制,废弃带有旧架构信息的当前快照。

如果不希望自定义存储过程在事务发布的架构更改之后在订阅服务器上重新创建,那么应当指定何时创建发布。

 

说明  当向允许转换已发布的数据的发布添加列或从这样的发布除去列时,DTS 包将需要重新生成。


禁用初始同步处理期间的自定义存储过程的自动创建(事务复制):

在创建发布向导中的"指定项目"页上,选择要发布的项目,并为特定表项目单击与之相关的属性("...")按钮。


在"命令"选项卡上,清除"在订阅的初始同步处理期间创建存储过程"复选框。
更改当前快照的强制重新初始化和失效的默认属性(事务复制):

执行 sp_repladdcolumn 或 sp_repldropcolumn,其中 @force_reinit_subscription 参数值取 1。当设置为 1 时,将不会向订阅服务器传播架构更改命令。除 nosync 订阅外(对于它不进行任何操作),架构更改所影响的所有订阅将重新初始化。


执行 sp_repladdcolumn 或 sp_repldropcolumn,其中 @force_invalidate_snapshot 参数值取 0。当设置为 0 时,仍然会在需要时提供带有先前架构信息的当前快照。该参数只影响用 immediate_sync 选项创建的发布。
将架构更改应用于特定的发布
通常,架构更改在包括到某个项目中时会传播到所有的订阅服务器和发布服务器。可以随意选择要在其中添加列的发布,而架构的更改将只传播到这些发布的订阅服务器。


在除去某列时,所有发布和订阅服务器都会受到影响;不能有选择地在某个特定发布上执行此更改。
在发布数据库上应用架构更改

企业管理器

如何在发布数据库上应用架构更改(企业管理器)
将列添加到项目

在 SQL Server 企业管理器中的 Replication 下,展开 Publications,然后右击需要修改架构的发布。


单击"属性"命令,单击"筛选列",然后单击"添加列"。


在"将列添加到复制的表"对话框中,输入列名和定义该列的 SQL 语法。在用于列定义的 SQL 中,必须指定默认值,或者允许 NULL 值。


有关定义列所要求的语法的信息,请参阅 Transact-SQL ALTER TABLE 语句。


在"将列添加到复制的表"对话框中,选择要添加列的发布。
从项目中除去列

在 SQL Server 企业管理器中,展开 Replication,展开 Publications,然后右击要修改架构的发布。


单击"属性"命令,单击"筛选列",在"发布中的表"列表中选择表,在"选定表中的列"列表中选择列,然后单击"除去列"。


如果列受到约束,那么您会被提示;不能除去带有主键或唯一约束的列,以及 uniqueidentifier 列。如果您试图删除这类列中的一个,则会显示错误信息。对于其它限制,则显示警告消息,单击"确定"按钮除去列。


Transact-SQL


如何在发布数据库上应用架构更改 (Transact-SQL)
将列添加到项目

执行 sp_repladdcolumn 存储过程并设置以下参数。 参数
 功能
 
@source_object
 对要将列添加到的表进行命名。
 
@column
 对将要添加的列进行命名。
 
@typetext
 定义列(数据类型信息、默认值等)。在用于列定义的 SQL 中,必须指定默认值,或者允许 NULL 值。
有关定义列所需语法的信息,请参阅 ALTER TABLE。

 
@publication_to_add
 列出要向其添加列的发布的名称;也可以使用 all 或 none 这两个值。
 
@force_invalidate_snapshot
 当设置为 0 时,仍然会在需要时提供带有先前架构信息的当前快照。该参数只影响用 immediate_sync 选项创建的发布。
 
@force_reinit_subscription
 当设置为 1 时,将不会向订阅服务器传播架构更改命令。架构更改影响到的所有订阅都将进行重新初始化,但非同步订阅除外,对它不会有任何影响。
 


从项目中除去列

执行 sp_repldropcolumn 存储过程并设置以下参数。 参数
 功能
 
@source_object
 对将从其中除去列的表进行命名。
 
@column
 对将要除去的列进行命名。
 
@force_invalidate_snapshot
 当设置为 0 时,仍然会在需要时提供带有先前架构信息的当前快照。该参数只影响用 immediate_sync 选项创建的发布。
 
@force_reinit_subscription
 当设置为 1 时,将不会向订阅服务器传播架构更改命令。架构更改影响到的所有订阅都将进行重新初始化,但非同步订阅除外,对它不会有任何影响。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值