原文:SQLServer 可更新订阅数据在线架构更改(增加字段)方案

之前一直查找冲突发布和订阅数据不一致的原因,后来发现多少数据库升级引起,因为一直以来都是在发布数据库增加字段,订阅也会自动同步。在此时如果订阅队列有数据,这些数据将丢失。参考上一篇说明:SQLServer 可更新订阅数据冲突的一个原因 。当在发布数据库增加一个字段时,系统同步存储过程和触发器都会重新生成,这会导致仍在队列中的数据无法正常同步。订阅队列中的命令将因“同步”后消失,代理有可能出错,但也会自动回复正常!~

这周测试了一些方法,最终算是确定一个方案可行的,虽然麻烦和耗时。

首先看简单的架构图:

上图中,上面为发布服务器,下面为订阅服务器。以一个表为例,正常发布为 Table T1 的可更新订阅发布,数据双向同步,用户都是在订阅数据库操作,都是操作视图。增加字段时,为了使用户能够在订阅正常操作,再创建一个发布订阅,只发布一张表,数据太多时初始化会较久。注意:新的发布不能是同一个数据库!如果是同一个数据库,为了避免和原来的表名一样,更改了新订阅的表名,会导致
发布到原来的订阅数据不同步!所以新的订阅在另一个数据库上,保持表名称一致!因为系统调用的存储过程表结构一致。~如上图,所以一个发布中,在订阅服务器中要求两个数据库订阅,其中一个发布订阅只有一张表,该表将是新增字段的表。此时3张表都同步发布双向同步。

因为用户都是操作视图的,所以视图的定义改为到新的数据库表中,用户操作仍正常,数据同步也正常。对新增加的发布,禁止架构同步,发布数据库增加字段时,不会同步到新订阅表中,但是会同步到原订阅表中。待字段同步完成后,视图定义改回原来的表,此时发布和订阅都有新字段了。而作为中介创建的的发布订阅可以删除了!~

主要步骤如下:

1.  确保发布和订阅数据一致

2.  创建1个可更新订阅发布,只发布1张表 (发布数据库执行)

3.  新发布的“冲突解决策略”: 保留发布服务器更改(发布属性更改)

4.  新发布的“复制架构更改”: false(发布属性更改)

5.  创建订阅(订阅服务器新的数据库)

6.  更改作业所有者;初始化订阅;等待完成…………

7.  发布更改视图定义(会同步到原订阅中),使用另一个数据库的订阅表(发布数据库执行,注意订阅表权限问题)

8.  确定原订阅的队列已经同步完成

9.  发布数据库中对表增加字段(自动同步到原订阅中,新订阅不同步)

10. 订阅队列如无积累,更改发布视图的定义,使用原来数据库的表(发布数据库执行)

11. 最后删除新创建的发布

--1.	确保发布和订阅数据一致
--2. 创建可更新订阅(筛选)发布,只发布1表(发布数据库执行)
--3. 新发布的“冲突解决策略”: 保留发布服务器更改(发布属性)
EXEC sp_changepublication @publication = N'temp02', @property = N'conflict_policy', @value = N'pub wins'
EXEC sp_changepublication @publication = N'temp03', @property = N'conflict_policy', @value = N'pub wins' --4. 新发布的“复制架构更改”: false(发布属性)
EXEC sp_changepublication @publication = N'temp02', @property = N'replicate_ddl', @value = 0
EXEC sp_changepublication @publication = N'temp03', @property = N'replicate_ddl', @value = 0 --5. 创建订阅(订阅服务器新的数据库)
--6. 更改作业所有者;初始化4个订阅;等待完成…………
--7. 发布更改视图定义,使用另一个数据库的订阅表(发布数据库执行,注意订阅表权限问题)
ALTER VIEW [dbo].[VTestTab]
as
SELECT Identifier,Name,value,info
FROM DemoDB.dbo.TestTab --另一个订阅数据库的表
GO --8. 确定原订阅的队列已经同步完成
--9. 发布数据库中对表增加字段(自动同步到原订阅中)
ALTER TABLE dbo.TestTab ADD TEST INT --10.订阅队列无太多,则更改发布视图定义,使用原来数据库的表(发布数据库执行)
ALTER VIEW [dbo].[VTestTab]
as
SELECT Identifier,Name,value,info
FROM dbo.TestTab
GO --11.删除新创建的发布

测试完成!~个人测试正常,还未应用到生产库中。其中最麻烦的是要初始化表数据,这是主要耗时的。

SQLServer 可更新订阅数据在线架构更改(增加字段)方案的更多相关文章

  1. SQLServer 可更新订阅数据冲突的一个原因

    原文:SQLServer 可更新订阅数据冲突的一个原因 可更新订阅为什么有冲突? 可更新订阅中,当升级增加一个字段时,通常在发布服务器的发布数据库中增加,对表增加字段后,发布自动同步到订阅数据库中(复 ...

  2. SqlServer 可更新订阅升级字段队列数据丢失原因

    原文:SqlServer 可更新订阅升级字段队列数据丢失原因 之前简单描述过数据冲突发生的原因:SQLServer可更新订阅数据冲突的一个原因 ,但具体内部原理是怎么丢失的还不清楚,今天补充说明.可更 ...

  3. SqlServer 可更新订阅队列读取器代理错误:试图进行的插入或更新已失败

    原文:SqlServer 可更新订阅队列读取器代理错误:试图进行的插入或更新已失败 今天发现队列读取器代理不停地尝试启动但总是出错: 其中内容如下: 队列读取器代理在连接"Publicati ...

  4. SqlServer:SqlServer(数据库备份,数据文件迁移,增加数据库文件组,递归查询一周报送情况,查询近X天未报送单位,截断数据库日志,复制单个或多个数据库表到另一个数据库 )

    1.数据备份 ) ) ) )),'-','') ) SET @savePath = 'f:/DatabaseBackup/' DECLARE My_Cursor CURSOR FOR ( select ...

  5. SqlServer 使用脚本创建分发服务及事务复制的可更新订阅

    原文:SqlServer 使用脚本创建分发服务及事务复制的可更新订阅 [创建使用本地分发服务器] /************************[使用本地分发服务器配置发布]*********** ...

  6. Dynamics CRM2013 更新用户数据主要电子邮件字段报数据加密错误

    今天在更新用户数据中的主要邮件字段时报数据 可以进系统设置-数据管理-数据加密中开启,但前提是必须启用https访问而不能用http,在第二个框内输入秘钥点击激活就行了,我这边已经激活过了所以显示的是 ...

  7. mysql中大数据表alter增加字段报错:"1034 Incorrect key file for table 'table_name'; try to repair it"

    mysql中大数据表alter增加字段报错:"1034 Incorrect key file for table 'table_name'; try to repair it" 现 ...

  8. SqlServer 禁止架构更改的复制中手动修复使发布和订阅中分别增加的字段同步

    原文:SqlServer 禁止架构更改的复制中手动修复使发布和订阅中分别增加的字段同步 由于之前的需要,禁止了复制架构更改,以至在发布中添加一个字段,并不会同步到订阅中,而现在又在订阅中添加了一个同名 ...

  9. SqlServer Bug:复制架构更改参数(replicate_ddl)无效

    原文:SqlServer Bug:复制架构更改参数(replicate_ddl)无效 最近测试可更新订阅的架构更改问题,发现了一个 bug. 在复制中,当在发布数据库对发布数据库进行架构更改时,结构自 ...

随机推荐

  1. innodb_data_file_path参数误修改解决方法

    如果innodb_data_file_path参数被修改乱了,不知道原来值的大小,这样启动是会报错的.知道原来大小方法: 方法一:操作系统下ls -l看到原来大小,直接用ls -l显示的大小,复制即可 ...

  2. 为什么未来是全栈project师的世界?

    谨以此文献给每个为成为优秀全栈project师奋斗的人. 节选自<Growth: 全栈增长project师指南> 技术在过去的几十年里进步非常快,也将在未来的几十年里发展得更快. 今天技术 ...

  3. Archive for the ‘Erlang’ Category 《Erlang编程指南》读后感

    http://timyang.net/category/erlang/ 在云时代,我们需要有更好的能利用多核功能及分布式能力的编程语言,Erlang在这方面具有天生的优势,因此我们始终对它保持强烈关注 ...

  4. 【erlang 网络编程学习】 分析cowboy acceptor实现

    http://www.tuicool.com/articles/vuymei 不知道为什么就看了cowboy代码,就继续看了下去了. 分析一下吧,主要写写cowboy 的acceptor pool 的 ...

  5. WPF 在绘图控件(Shape)中添加文字 [2018.7.15]

    原文:WPF 在绘图控件(Shape)中添加文字 [2018.7.15] Q:使用Shape的子类Ellipse画一个圆,如何在圆中添加文字? A:Shape类中不包含Text属性.可使用Shape类 ...

  6. 课后作业11--使用SQL语句创建一个数据库

    use master if db_id ('test') is not null--判断test数据库是否存在 drop database [test]--如果存在 删除test go--完成查找删除 ...

  7. 一题多解(五) —— topK(数组中第 k 大/小的数)

    根据对称性,第 k 大和第 k 小,在实现上,是一致的,我们就以第 k 小为例,进行说明: 法 1 直接排序(sort(A, A+N)),当使用一般时间复杂度的排序算法时,其时间复杂度为 O(N2) ...

  8. gdal库集成MrSID库的做法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 首先从Lizardtech网站:http://www.lizardtech.com/download/develope ...

  9. Msg DisPatch

    一天写了个Carlife 协议数据分流器 #include <stdio.h> #include <string.h> typedef unsigned char uint8_ ...

  10. lzugis——Arcgis Server for JavaScript API在自己的定义InfoWindow

    你看到这个标题嫌烦.因为我最近一直与研究问题,相关文章使这些也可以只,同时要读我文章的朋友.我的文章能够给你带来帮助. 在相关的内部的前两篇文章,达到InfoWindow经div实现的东西,成Info ...