我注意到,当您设置事务复制时,SQL Server会将身份范围管理设置为手动。这意味着在我的订阅数据库中,当我尝试将新记录插入到其PK为标识列的表中时,它将给我一个错误,并说它试图插入PK为“ 1”,“ 2” ”,“ 3”等。这是因为订阅服务器上所有标识列的当前标识值都重置为种子值(通常为1),而不是停留在发布者上的原始值上。
我了解为什么SQL Server会这样做-您应该将订户表保留为只读状态。但是,我的情况有点不合常规-我不时通过复制更新订户,立即备份该数据库,然后我想对订户进行一些更新,以免将其推回发布者,然后当我再次更新订户时,我从较早的备份中还原了它的数据库并提取了最新的更新。因为我想在这些更新之间进行订阅服务器的更新(如果需要,可以使用“临时增量”),因此我需要Identity列起作用,并且复制时不要重置为1。
我尝试在设置发布时打开自动标识范围管理,但是当我尝试向发布中添加表时,这只会给我以下错误:
消息21231,级别16,状态1,过程sp_MSrepl_addarticle,第2243行
自动标识范围支持仅对允许更新订户的发布有用。
有什么办法可以解决这个问题?我确实想将此复制呈现给SQL Server,就好像它在订阅服务器端是只读的,因为我不打算进行将被推回发布服务器的更新,但是我确实想进行临时更新在下一次复制之前将被删除。
对于我的使用模式,我还认为快照复制可能比事务复制更合适,但是麻烦在于快照复制需要每个更新发送整个darn数据库。因为我打算在最新复制后立即备份数据库,所以我不需要每次都进行整个传输。只是自上次以来的变化。
Is there any way I can get round this problem?
对于SQL Server 2005及更高版本,必须使用sys.sp_identitycolumnforreplication将Identity列设置为NOT FOR REPLICATION。当您将标识列更改为非复制时,您甚至不必重新快照您的文章。只是不要使用GUI。