原文: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. php如何实现把多平台文件中所有的行合成一行?

    php如何实现把多平台文件中所有的行合成一行? 一.总结 1.str_replace中的数组替换:str_replace(array("/r","/n",&qu ...

  2. mysql的四种启动方式

    查看该版本的相应参数: mysqld --verbose --help     1.mysqld  ./mysqld --defaults-file=/etc/my.cnf --user=mysql ...

  3. Android6.0动态申请权限那些坑--以及避免用户选择不再提示后无法获取权限的问题

    Android 6.0 为了保护用户隐私,将一些权限的申请放在了应用运行的时候去申请, 比如以往的开发中,开发人员只需要将需要的权限在清单文件中配置即可,安装后用户可以在设置中的应用信息中看到:XX应 ...

  4. 控制器管理UINavigationController、UINavigationBar

    控制器管理 掌握 控制器以及view的多种创建方式 UINavigationController的简单使用:添加\移除子控制器 UINavigationBar内容的设置 控制器的生命周期方法 Segu ...

  5. Oracle数据库零散知识09 -- DBLink的创建(转)

    通过创建database link实现Oracle跨数据库查询的方法 在Oracle本地数据库端执行赋权dbuser帐号 SQL> grant create database link to d ...

  6. erlang OTP gen_server 图解分析

    http://www.hoterran.info/otp-gen_server-sourcecode 在阅读erlang的otp源码gen_server.erl的时候,一直想写点什么,用一种最好的方式 ...

  7. ElasticSearch:分析器

    ElasticSearch入门 第七篇:分析器 这是ElasticSearch 2.4 版本系列的第七篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch El ...

  8. QQ登录, 腾讯开放平台和QQ互联的坑

    原文:QQ登录, 腾讯开放平台和QQ互联的坑 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u012881042/article/details/7 ...

  9. WPF 好看的矢量图标

    原文:WPF 好看的矢量图标 本文告诉大家一个好用的网站,里面提供很多好看的图标. 本文介绍的网站是 Xamalot 里面有很多好看的图标. 例如我找到了一个好看的图标 我只需要点击下面的下载就可以了 ...

  10. Delphi程序员如何找到高薪的工作?(赚不到钱,原因只有一个,就是他们没有被公司录取。Delphi必须要独自进行深入研究,才能精通,同时也不能自由性太强)

    转帖自:http://www.tommstudio.com/ViewNews.aspx?ID=187http://hi.baidu.com/rarnu/blog/ 本文翻译自<美国优秀经理观念大 ...