[英]Inserting into table with an Identity column while replication causes error in SQL Server
我的数据库中有一个表A_tbl
。 我在A_tbl
上创建了一个触发器来捕获插入的记录。 触发器正在我的队列表B_tbl
插入记录。 此表有一个Identity
列,其属性“不用于复制”为 1。
A_tbl
(Id, name, value) 以Id
为主键B_tbl
( B_tbl
, Id) 以uniqueId
作为Identity
列执行此操作的触发代码:
Insert into B_tbl (Id)
select i.Id from inserted
现在我的表 'B' 被复制到另一个数据库服务器,现在当我插入表 'A' 时,它导致了这个错误:
当 IDENTITY_INSERT 设置为 ON 或复制用户插入 NOT FOR REPLICATION 标识列时,必须为表 'B_tbl' 中的标识列指定显式值。 (来源:MSSQLServer,错误号:545)
请帮我解决这个问题。
你必须做这样的事情
SET IDENTITY_INSERT A_tbl ON
Insert into B_tbl (uniqueid, Id)
select 1, i.id from inserted
SET IDENTITY_INSERT A_tbl OFF
触发器代码应包含Identity insert ON选项,如下所示
SET IDENTITY_INSERT B_tbl ON
Insert into B_tbl (uniqueid,Id)
select identityvalue,i.Id from inserted
SET IDENTITY_INSERT B_tbl OFF
在没有错误的情况下,INSERT记录基本上有两种不同的方法:
1)当IDENTITY_INSERT设置为OFF时。 主要钥匙“身份证”不得存在
2)当IDENTITY_INSERT设置为ON时。 必须存在 PRIMARY KEY “ID”
根据使用IDENTITY PRIMARY KEY创建的同一个表中的以下示例:
CREATE TABLE [dbo].[Persons] (
ID INT IDENTITY(1,1) PRIMARY KEY,
LastName VARCHAR(40) NOT NULL,
FirstName VARCHAR(40)
);
1)在第一个示例中,您可以在IDENTITY_INSERT为OFF时将新记录插入表中而不会出现错误。 “INSERT INTO”语句中不得出现 PRIMARY KEY “ID”, 并自动添加唯一的ID值: 。 如果在这种情况下INSERT中存在ID,您将收到错误“无法为表中的标识列插入显式值...”
SET IDENTITY_INSERT [dbo].[Persons] OFF;
INSERT INTO [dbo].[Persons] (FirstName,LastName)
VALUES ('JANE','DOE');
INSERT INTO Persons (FirstName,LastName)
VALUES ('JOE','BROWN');
表[dbo]的输出。[人员]将是:
ID LastName FirstName
1 DOE Jane
2 BROWN JOE
2)在第二个示例中,您可以在IDENTITY_INSERT为ON时将新记录插入表中而不会出现错误。 只要ID值不存在 ,PRIMARY KEY “ID”必须出现在“INSERT INTO”语句中 :如果在这种情况下INSERT中不存在ID,则会出现“显式值必须为为标识列表指定...“
SET IDENTITY_INSERT [dbo].[Persons] ON;
INSERT INTO [dbo].[Persons] (ID,FirstName,LastName)
VALUES (5,'JOHN','WHITE');
INSERT INTO [dbo].[Persons] (ID,FirstName,LastName)
VALUES (3,'JACK','BLACK');
表[dbo]的输出。[人员]将是:
ID LastName FirstName
1 DOE Jane
2 BROWN JOE
3 BLACK JACK
5 WHITE JOHN
只是为像我这样的人添加一个可能的问题,按照本书做了所有事情并且仍然收到消息。
检查插入时的触发器。 他们可能会在执行没有显式标识列值的代码时尝试创建更多行。
如果是这种情况,请禁用触发器(或删除并重新创建它)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.