想问下 SQL Server中关于 Identity 列复制问题,我用的是 SQL 2000 数据库,做事务复制,
按照 帮助所说的,只要把 Identity 列 设置为 not for replication 就可以复制,但是在实际应用中,我把 发布和订阅 都设计为 not for  replication 就是报 标识列 无法更新。当然把订阅表字段不设为 identity就可以了。还有更离谱的 因为我是对  一些表做同步,有identity列,也有外键关系,为了 能正常订阅数据,我通过语句把 identity列 设置为 非 identity 属性,但是在做事务复制初始化的时候,即快照复制的时候,没一次成功,发生了表丢失问题,甚至是有外键关系的母表。但是不做修改,仍旧为 identity列的时候,初始化尽然能成功,当然后续事务复制的时候还是会报 标识列无法更新问题。大家有什么好的帮助吗。

解决方案 »

  1.   

    建完复制后,在订阅端数据库中会自动生成3个存储过程: insertXXX,updateXXX,deleteXXX.
    打开其代码看看,将其中对identity列的insert和update注释掉即可.--如原写法
     update [表名] 
       set [identity列]=...,
           [列2]=...,
           [列3]=...--修改为
     update [表名] 
       set -- [identity列]=...,
           [列2]=...,
           [列3]=...
      

  2.   

    #1.如果改存储过程,就不能保证:两边的表的identity字段,完全同步。所以不建议。
    #2.对于有IDENTITY表的复制,把订阅表的相应列定义为not for replication即可。2005没遇到过楼主说过的问题,2000的话不知。
    #3.表丢失,跟IDENTITY列是没有关系的。事务性复制初始化快照相当于一个删除表(这个默认设置,也可以设置为截断表),再BCP的过程。
    #4.至于外键,是否会影响复制,需要测试。但个人不建议使用外键:一般来说,数据量少时,可以起到约束1对N的关系,但同时也存在一定的性能问题。即使不用外键,只要逻辑正确,一般也不会出什么问题
      

  3.   


    因为我这里有几个表的数据非常大,所以初始化更多是为了得到3个存储过程。因为现在还只是测试阶段,其实如果要保障正常运行,我完全可以在另外一个库中初始化,然后得到那些存储过程,再移过来就行了,但是测试的时候却意外发现表丢失问题,这就很严重了,因为复制的过程是不能保证百分百的可靠,哪天忘记了今天碰到的问题,重新做了初始化,表丢失就是非常严重的问题了。而且 是 sysobjects有,但实际却没有的那种表,因为是外键主表,无法直接删除。那个订阅表的标识列我肯定是把他设为 identity not for replication。不过我看了一下,我主要是通过语句把 标识列设为 非标识列的,update syscolumns set colstat=0 where id=object_id('表名') and colstat=1
    go而且,这个运行以后,复制就必定报错,所以先看看这里有什么问题吧。
      

  4.   

    说错了,标识列。要用下面SQL定义。
    CREATE TABLE #temp
    (
    id INT NOT NULL  IDENTITY(1,1) NOT FOR REPLICATION
    )ALTER TABLE #temp
    ALTER COLUMN id
    DROP NOT FOR REPLICATION
    --增加NOT FOR REPLICATION属性
    ALTER TABLE #temp
    ALTER COLUMN id
    ADD NOT FOR REPLICATION  
      

  5.   


    我发布的时候肯定是 选择 删除数据的,drop表我测试的时候明确表示 有外键,无法删除,但是 现在确实就是删除数据 反而发生 表丢失问题,比较郁闷。当然有可能就是我通过 修改系统表引起的,所以我需要做进一步测试。另外我的标识列是通过企业管理器手工操作的,操作结果应该和你sql 语句操作结果一样的。但是仍然报标识列无法更新。
      

  6.   

    经过一天的测试 发现 最终错误还是 出在
     update syscolumns set colstat=0 where id=object_id('表名') and colstat=1这个上面,这样直接改 系统表的做法是错误的 会引起很多问题,原本我就是想偷懒 ,不想通过 企业管理器修改 字段属性,当然了,文档也没有做说明如何 通过sql 语句来做,毕竟表多,如果订阅的数据库多改动的 地方太多了,工作量很多,不过看了外国人的一篇文章,终于知道怎么获得修改的sql脚本了,大家可以参考下 
    http://blog.sqlauthority.com/2009/05/03/sql-server-add-or-remove-identity-property-on-column/
    sql server 2000企业管理器 也可以这么做。