环境:sql2005方法一:
主库上改成:是(不用于复制) --现在的方法方法二:
从库上直接去掉identity属性,让他变成简单的INT型,或者改成可插入的IDENTITY型
一直用的是第一种方法,刚才偶尔试了一下第二种方法,顺利通过。而且不会弹错误所以,问题是:生产环境下 可不可以用第二种方法,这种方法有什么缺点?

解决方案 »

  1.   

    如果标识列是主键,且库中有对应的外键,那去掉标识可能会破坏参照完整性.
    因此,如果要用复制,设置了标识列的 NOT FOR REPLICATION 后,不能直接作为从表的外键.因为它可能不对.
    你可以考虑不用外键约束,而在业务层检测主从关系.
      

  2.   

    没有用到外键这里说的主库(写) 从库(读),主库上字段还是IDENTITY(1,1),从库上去掉IDENTITY属性而已。这样它就不自增了。直接从主库上复制过来 岂不快哉?。。而且实验数据也正常复制过来了,没有出错我奇怪的是有这么简单的方法,为什么还要改主库的 NOT FOR APPLICATION属性  
      

  3.   

    TO:小F它自增不自增没关系,刚好要的就是跟主库保持一致。。 订阅者本身也没有自增的需求,不是吗?
      

  4.   


    不是要对等复制,还是一主一从的单向复制,只是觉得第二种方法也能解决 NOT FOR APPLICATION的问题询问一下,第二种方法有什么坏处。
      

  5.   

    哦。实践通过没问题,那你就用吧 呵呵弱弱的问一句NOT FOR APPLICATION 是什么?
      

  6.   

    你的方法一有个问题,就是2边都是自增长字段,万一哪天订阅端的自增长字段值跟发布端不一样,那么更新删除就会有问题。
    你的方法二也有问题,就是可能程序就是要用自增长字段,你无故去掉,程序就要有改动。
    正确的解决方案是:
    方法一:在订阅端插入自增长字段的时候,加上SET IDENTITY_INSERT 表名 ON
    具体如何实现,你自己好好看看,我这里就不详细阐述了。
    方法二:订阅端直接把自增长属性去掉,然后先插好数据,在做订阅端的时候,选择不初始化数据即可。
    其实还有方法三,只是麻烦点就是2边都是自增长字段,但是每天都去检查下,如果发现自增长值不对,用
    DBCC CHECK_INDENTITY 修正下,但是毕竟麻烦,不建议你使用了。
      

  7.   

    你的第二种方法缺点是:
    1.如果你发布端坏掉了,要马上启用订阅端,你这时你的自增长字段是普通的INT型,而不是IDENTITY型,那么就有问题,程序就会出错,你还要重新切换之类的,很麻烦。
      

  8.   


    这确实是个问题。。所以一个更好的配置复制的方法应该是:第一步:发布库的 IDENTITY 属性不变(这时候是否还有必要要改成NOT FOR REPLICATION?)第二步:订阅库所有自增字段的SET IDENTITY_INSERT 表名 ON
      

  9.   

    【小爱】 :NOT FOR REPLICATION 写错了,当时 不是APPLICATION