想问下 SQL Server中关于 Identity 列复制问题,我用的是 SQL 2000 数据库,做事务复制,
按照 帮助所说的,只要把 Identity 列 设置为 not for replication 就可以复制,但是在实际应用中,我把 发布和订阅 都设计为 not for replication 就是报 标识列 无法更新。当然把订阅表字段不设为 identity就可以了。还有更离谱的 因为我是对 一些表做同步,有identity列,也有外键关系,为了 能正常订阅数据,我通过语句把 identity列 设置为 非 identity 属性,但是在做事务复制初始化的时候,即快照复制的时候,没一次成功,发生了表丢失问题,甚至是有外键关系的母表。但是不做修改,仍旧为 identity列的时候,初始化尽然能成功,当然后续事务复制的时候还是会报 标识列无法更新问题。大家有什么好的帮助吗。
按照 帮助所说的,只要把 Identity 列 设置为 not for replication 就可以复制,但是在实际应用中,我把 发布和订阅 都设计为 not for replication 就是报 标识列 无法更新。当然把订阅表字段不设为 identity就可以了。还有更离谱的 因为我是对 一些表做同步,有identity列,也有外键关系,为了 能正常订阅数据,我通过语句把 identity列 设置为 非 identity 属性,但是在做事务复制初始化的时候,即快照复制的时候,没一次成功,发生了表丢失问题,甚至是有外键关系的母表。但是不做修改,仍旧为 identity列的时候,初始化尽然能成功,当然后续事务复制的时候还是会报 标识列无法更新问题。大家有什么好的帮助吗。
解决方案 »
- 关于数据库多表查询的问题
- 请教一个sqlserver2005的函数问题
- SQL 2000中自定义函数拆分字段,返回值的问题
- 200分求一条SELECT语句
- 一个AFTER INSERT的触发器问题
- Transact-SQL中的派生表与Top n 查询之间的区别?急!
- 那里有介绍存储过程比较好的文章??
- 怎样得知以前的操作.怎样取消以前的操作?谢谢.
- JSP连接SQL Server ,alexsten(小毅) 给了一个 bean ;hhaibin(小海) 给了一个Javabean ;cqzhangq(阿干)给了一个servlet。都怎么用啊,谢谢。
- 灾难性错误——Sybase服务器端调整了字符集后,与ODBC的设置是否有冲突?
- sqlserver2000 lms数据库文件解析
- 如何快速寻找无用索引,然后删除掉,附带快速建立缺失索引代码
打开其代码看看,将其中对identity列的insert和update注释掉即可.--如原写法
update [表名]
set [identity列]=...,
[列2]=...,
[列3]=...--修改为
update [表名]
set -- [identity列]=...,
[列2]=...,
[列3]=...
#2.对于有IDENTITY表的复制,把订阅表的相应列定义为not for replication即可。2005没遇到过楼主说过的问题,2000的话不知。
#3.表丢失,跟IDENTITY列是没有关系的。事务性复制初始化快照相当于一个删除表(这个默认设置,也可以设置为截断表),再BCP的过程。
#4.至于外键,是否会影响复制,需要测试。但个人不建议使用外键:一般来说,数据量少时,可以起到约束1对N的关系,但同时也存在一定的性能问题。即使不用外键,只要逻辑正确,一般也不会出什么问题
因为我这里有几个表的数据非常大,所以初始化更多是为了得到3个存储过程。因为现在还只是测试阶段,其实如果要保障正常运行,我完全可以在另外一个库中初始化,然后得到那些存储过程,再移过来就行了,但是测试的时候却意外发现表丢失问题,这就很严重了,因为复制的过程是不能保证百分百的可靠,哪天忘记了今天碰到的问题,重新做了初始化,表丢失就是非常严重的问题了。而且 是 sysobjects有,但实际却没有的那种表,因为是外键主表,无法直接删除。那个订阅表的标识列我肯定是把他设为 identity not for replication。不过我看了一下,我主要是通过语句把 标识列设为 非标识列的,update syscolumns set colstat=0 where id=object_id('表名') and colstat=1
go而且,这个运行以后,复制就必定报错,所以先看看这里有什么问题吧。
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
我发布的时候肯定是 选择 删除数据的,drop表我测试的时候明确表示 有外键,无法删除,但是 现在确实就是删除数据 反而发生 表丢失问题,比较郁闷。当然有可能就是我通过 修改系统表引起的,所以我需要做进一步测试。另外我的标识列是通过企业管理器手工操作的,操作结果应该和你sql 语句操作结果一样的。但是仍然报标识列无法更新。
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企业管理器 也可以这么做。