请教 关于复制中的表结构的修改.
我有个数据库中的一些表已经发布并且已经被订阅.现在遇到这样一个问题:
其中的一个表,数据不是经常改动,它原来的表结构不合理,我想修改它的表结构(新增字段,并修改主键盘).但该表已经发布并且被订阅,所以不允许修改(只可新增).
请教,如何不影响其他表的复制的同时,暂时只取消我要修改表的订阅和发布(不停止已经发布和订阅的其他表),等我改了这个表的结构后,再发布和订阅?
希望大家帮帮,给些意见也好,谢谢.
注:我用的是事务复制.
问题点数:100、回复次数:5Top
1 楼lang8134(heaton)回复于 2006-05-05 15:30:11 得分 0
希望大家能给些意见也好。
Top
2 楼edp08(王二)回复于 2006-05-05 16:44:00 得分 20
可以这样吗?
只能帮顶了
Top
3 楼salonstar(Tommy)回复于 2006-05-06 12:11:03 得分 80
復制的表,只能用sp_repladdcolumn 來增加列,用sp_repldropcolumn 來刪除列,詳細可以查看這兩個存儲過程之幫助,以上操作只需在出版數據庫中執行,下次復制時,會自動傳送到訂閱數據庫。
如果增加的列為需要定義為主鍵,則需要:
sp_repladdcolumn 'table_name','column_name','char(10) not null default '''''
也就是說,增加列時需要指定該列為not null, 同時需要指定default value才可以。
如果sp_repldropcolumn 需要刪除一個主鍵的列時,先要將主鍵取消(包括出版及訂閱),然后再執行sp_repldropcolumn 才可以,同樣如果刪除的列有default value則,需要先手工刪除default value(包括出版及訂閱),然后再執行。
Top
4 楼salonstar(Tommy)回复于 2006-05-06 12:14:07 得分 0
註:復制後,你是無法進行修改列的,只能先將數據備份好,然后刪除列,再增加列,然后將數據還原回去。Top
5 楼lang8134(heaton)回复于 2006-05-06 12:44:39 得分 0
谢谢edp08() 帮顶,也感谢 salonstar(Tommy) 的答复.
1.我先把订阅和发布项目删除了(tj_mzzb_new是我发布的一张表):
--删除 tj_mzzb_new的订阅
sp_dropsubscription @publication = N'bsrun',@article = N'tj_mzzb_new',
@subscriber = N'query',@destination_db = N'bsrun'
--删除 tj_mzzb_new的复制
sp_droparticle @publication = 'bsrun' , @article = 'tj_mzzb_new'
2.之后又手动的加上发布和订阅:
--增加 复制项目tj_mzzb_new
exec sp_addarticle @publication = N'bsrun', @article = N'tj_mzzb_new', @source_owner = N'dbo', @source_object = N'tj_mzzb_new',
@destination_table = N'tj_mzzb_new', @type = N'logbased', @creation_script = null, @description = null,
@pre_creation_cmd = N'drop', @schema_option = 0x00000000000000F3, @status = 16, @vertical_partition = N'true',
@ins_cmd = N'SQL', @del_cmd = N'sp_MSdel_tj_mzzb_new', @upd_cmd = N'SQL', @filter = null, @sync_object = null,
@auto_identity_range = N'false'
exec sp_articlecolumn @publication = N'bsrun', @article = N'tj_mzzb_new'
--增加订阅 项目tj_mzzb_new
exec sp_addsubscription @publication = N'bsrun',
@article = N'TESTT', @subscriber = N'query', @destination_db = N'bsrun',
@sync_type = N'none', @update_mode = N'read only', @offloadagent = 0, @dts_package_location = N'distributor'
注:以上操作也都是成功的,但当我写数据的时候,就出现了错误"进程未能执行sp_replcmds"(未能得到表 1576093101 的复制信息),不知道是为什么,还有待研究.
Top




