环境:sql2005方法一:
主库上改成:是(不用于复制) --现在的方法方法二:
从库上直接去掉identity属性,让他变成简单的INT型,或者改成可插入的IDENTITY型
一直用的是第一种方法,刚才偶尔试了一下第二种方法,顺利通过。而且不会弹错误所以,问题是:生产环境下 可不可以用第二种方法,这种方法有什么缺点?
主库上改成:是(不用于复制) --现在的方法方法二:
从库上直接去掉identity属性,让他变成简单的INT型,或者改成可插入的IDENTITY型
一直用的是第一种方法,刚才偶尔试了一下第二种方法,顺利通过。而且不会弹错误所以,问题是:生产环境下 可不可以用第二种方法,这种方法有什么缺点?
因此,如果要用复制,设置了标识列的 NOT FOR REPLICATION 后,不能直接作为从表的外键.因为它可能不对.
你可以考虑不用外键约束,而在业务层检测主从关系.
不是要对等复制,还是一主一从的单向复制,只是觉得第二种方法也能解决 NOT FOR APPLICATION的问题询问一下,第二种方法有什么坏处。
你的方法二也有问题,就是可能程序就是要用自增长字段,你无故去掉,程序就要有改动。
正确的解决方案是:
方法一:在订阅端插入自增长字段的时候,加上SET IDENTITY_INSERT 表名 ON
具体如何实现,你自己好好看看,我这里就不详细阐述了。
方法二:订阅端直接把自增长属性去掉,然后先插好数据,在做订阅端的时候,选择不初始化数据即可。
其实还有方法三,只是麻烦点就是2边都是自增长字段,但是每天都去检查下,如果发现自增长值不对,用
DBCC CHECK_INDENTITY 修正下,但是毕竟麻烦,不建议你使用了。
1.如果你发布端坏掉了,要马上启用订阅端,你这时你的自增长字段是普通的INT型,而不是IDENTITY型,那么就有问题,程序就会出错,你还要重新切换之类的,很麻烦。
这确实是个问题。。所以一个更好的配置复制的方法应该是:第一步:发布库的 IDENTITY 属性不变(这时候是否还有必要要改成NOT FOR REPLICATION?)第二步:订阅库所有自增字段的SET IDENTITY_INSERT 表名 ON