关于发布订阅的问题,不让插入数据的问题。

zhuxiaojun2002 2017-10-16 05:10:26
两台服务器a,b,都有数据库test
1、首先a发布,b订阅
增删改a中表的数据,都能同步到b中的对应表中。

现在的问题是删除了b的订阅,删除了a的发布,

然后在b做发布,a做订阅。此时在b中做插入操作,提示违反主键约束,不让插入数据。修改删除是可以的。
...全文
511 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhuxiaojun2002 2017-10-17
  • 打赏
  • 举报
回复
谢谢各位大佬。确实是订阅库中表的标识列种子没更新的问题。

这里有详细的解决方法,如楼上所说一样。希望能给以后遇到同样问题的人参考。
http://www.cnblogs.com/davidhou/p/4769317.html


还有个问题就是我禁用发布和分发的时候,虽然执行成功了,也确实删除了发布订阅,但是报错,这个怎么解决。


我是打算做一个服务,动态创建发布订阅,动态切换的。
OwenZeng_DBA 2017-10-17
  • 打赏
  • 举报
回复
DBCC CHECKIDENT ('dbo.TEST_01'); --只在sql2012以前的版本适用
DBCC CHECKIDENT ("Person.AddressType", RESEED) sql 2012 试用
OwenZeng_DBA 2017-10-17
  • 打赏
  • 举报
回复
引用 8 楼 zhuxiaojun2002 的回复:
SELECT IDENT_CURRENT('t1') 结果是1 SELECT MAX(IDENTITYCOL) FROM t1 结果是4 如果标识列种子(ID)已存在时,重置标识列?? 我有很多的表都是这种情况,怎么样一下子重置所有标识列呢
没办法一个语句重置所有的。你可以用下面的语句,生成重置所有标识列的语句,然后一起运行
SELECT b.name 表名,a.name 字段名,'DBCC CHECKIDENT (['+b.NAME+'], RESEED )' AS text
FROM sys.columns AS A,sys.tables AS B
WHERE a.object_id=b.object_id
and A.is_identity = 1
AND b.type='U'
删库到跑路 2017-10-17
  • 打赏
  • 举报
回复
有重复的数据吧,ID是int的标识列,用GUID吧,我原来也是这样的
zhuxiaojun2002 2017-10-17
  • 打赏
  • 举报
回复
现在发现问题的所在了
两台服务器a,b,都有数据库test
如果a发布到b,虽然标识列也复制过去了,如图

b服务器上主键自增id已经到4了,如果插入数据,他还是从自增的1开始,说与1冲突,失败后在插入,与2冲突、、、3、4,然后才能插入一条5的记录。
zhuxiaojun2002 2017-10-17
  • 打赏
  • 举报
回复
SELECT IDENT_CURRENT('t1') 结果是1 SELECT MAX(IDENTITYCOL) FROM t1 结果是4 如果标识列种子(ID)已存在时,重置标识列?? 我有很多的表都是这种情况,怎么样一下子重置所有标识列呢
OwenZeng_DBA 2017-10-17
  • 打赏
  • 举报
回复
你在a做发布,b做订阅时,是不是b没有主键,插入了重复的数据,然后反过来同步就报错了。 另外看提示,重复的值为1:检查下发布中是否有重复的
删库到跑路 2017-10-17
  • 打赏
  • 举报
回复
http://blog.csdn.net/column/details/15330.html 可以去看看,应该有你想要的
删库到跑路 2017-10-17
  • 打赏
  • 举报
回复
引用 17 楼 zhuxiaojun2002 的回复:
我是事务复制啊,但是要反向做回来的。 1、a发布,b订阅 2、a宕机,b启用,b删除订阅 3、a启动,a删除发布,b上创建发布,a上创建订阅。 这样的反复切换。
不大明白你的意思,你是要做数据同步还是故障转移
zhuxiaojun2002 2017-10-17
  • 打赏
  • 举报
回复
我是事务复制啊,但是要反向做回来的。 1、a发布,b订阅 2、a宕机,b启用,b删除订阅 3、a启动,a删除发布,b上创建发布,a上创建订阅。 这样的反复切换。
删库到跑路 2017-10-17
  • 打赏
  • 举报
回复
引用 15 楼 zhuxiaojun2002 的回复:
我是想实现两个机器的热备功能,只有两台机器。是不是还有更好的办法呢?
同步还是异步 同步就是事务复制,镜像和always on 异步日志传送和镜像的高性能模式
zhuxiaojun2002 2017-10-17
  • 打赏
  • 举报
回复
我是想实现两个机器的热备功能,只有两台机器。是不是还有更好的办法呢?
OwenZeng_DBA 2017-10-17
  • 打赏
  • 举报
回复
引用 13 楼 zhuxiaojun2002 的回复:
谢谢各位大佬。确实是订阅库中表的标识列种子没更新的问题。 这里有详细的解决方法,如楼上所说一样。希望能给以后遇到同样问题的人参考。 http://www.cnblogs.com/davidhou/p/4769317.html 还有个问题就是我禁用发布和分发的时候,虽然执行成功了,也确实删除了发布订阅,但是报错,这个怎么解决。 我是打算做一个服务,动态创建发布订阅,动态切换的。
为什么要这么做呢?动态的创建发布,动态的切换
中国风 2017-10-16
  • 打赏
  • 举报
回复
检查标识列是否一致,表值和当前值
SELECT IDENT_CURRENT('表名')

SELECT MAX(IDENTITYCOL) FROM 表名
如果标识列种子(ID)已存在时,重置标识列 标识列种子没问题时,在订阅端选同步表 设计表里和标识列设置 不用于复制 设置“是”
exception92 2017-10-16
  • 打赏
  • 举报
回复
b做发布之后,有主键不允许重复的数据插入。检查插入的数据
zhuxiaojun2002 2017-10-16
  • 打赏
  • 举报
回复
1发布订阅相关信息要删除干净 我不知道我删的干净不,都是在Management Studio里面做的。应该很干净了。 2.订阅端表里是不是有你没有同步主键。导致b中的test表里面已经有了重复数据 数据都是同步完成的
zhuxiaojun2002 2017-10-16
  • 打赏
  • 举报
回复
确实有主键(自增的),插入数据没问题,我是直接在SQL Server Management Studio编辑表,插入数据的,写sql语句也不行,
OwenZeng_DBA 2017-10-16
  • 打赏
  • 举报
回复
1发布订阅相关信息要删除干净 2.订阅端表里是不是有你没有同步主键。导致b中的test表里面已经有了重复数据
zhuxiaojun2002 2017-10-16
  • 打赏
  • 举报
回复
还有一个问题是,在SQL Server Management 中尝试插入,提示

在多次失败后,有可能插入成功,一旦插入成功的话后面就没问题了。

求高手指点。是不是哪里还记录了什么?

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧