繁体   English   中英

复制时插入带有标识列的表会导致 SQL Server 出错

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM