当 IDENTITY_INSERT 设置为 OFF 时,不能为表‘XXX’中的标识列插入显式值。
Posted on 2016-07-08 17:08 张鑫的园子 阅读(55016) 评论(0) 编辑 收藏 举报在创建事务复制时,很多时候不一定使用默认的快照进行初始化,而是使用备份还原初始化。而当对有标识列(即identity的自增列)的表进行复制的时候,使用备份还原初始化搭建起来的复制常常就会报错,即:当 IDENTITY_INSERT 设置为 OFF 时,不能为表‘XXX’中的标识列插入显式值。
这个错误是在创建表的时候,有一项’标识规范‘中的’不用于复制‘默认为‘否’,所以在发布端数据库插入数据时就会导致,右键表,选择设计选项可以看到,如图
当使用备份还原进行初始化,订阅端的这张表该选项也会默认为‘否’,因此就会报错。在不删除此复制的情况下,以下有几种方法可进行修改:
1. 最简单的就是把订阅服务器上这张表的该选项修改为‘是’即可;
2. 既然这里这个选项是‘否’,那么在创建这个表的时候在标识列就可以加一句:not for replication,但是既然已经有该表并且为了此表配置了复制,那么就可以在订阅服务器上执行下面这句代码即可,
use [database]
go
alter table [tablename] alter column [columnname] add not for replication
3. 第三种方法需要对复制的原理有一定的了解,复制只会将配置了复制的表上的update,delete和insert操作所造成的数据变化传递过来,在订阅服务器上针对这张表会创建三个存储过程,分别为dbo.sp_MSupd_dbo表名、dbo.sp_MSdel_dbo表名、dbo.sp_MSins_dbo表名,用这三个存储过程对订阅表进行修改。那么因为identity的存在,identity_insert选项为OFF,而每一次的插入需要将identity_insert设置为ON才可以进行插入,所以我们可以直接将插入的这个存储过程(dbo.sp_MSins_dbo表名)进行修改,加上下面这句,就可以自动插入数据。
set identity_insert [表名] on
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用