复制时插入带有Identity列的表会导致SQL Server错误

agm*_*m92 3 sql database sql-server ssms database-replication

A_tbl我的数据库中有一个表。我创建了一个触发器A_tbl来捕获插入的记录。触发器正在将记录插入我的队列表中B_tbl。该表具有一Identity列,其属性“不可复制”为1。

  • A_tbl(Id,名称,值)Id作为主键
  • B_tbl(uniqueId,Id)与uniqueIdas Identity

触发代码这样做:

Insert into B_tbl (Id)
    select i.Id from inserted
Run Code Online (Sandbox Code Playgroud)

现在,我的表“ B”被复制到另一个数据库服务器,现在当我将数据插入表“ A”时,将导致此错误:

当IDENTITY_INSERT设置为ON或将复制用户插入到NOT FOR REPLICATION标识列中时,必须为表'B_tbl'中的标识列指定显式值。(来源:MSSQLServer,错误号:545)

请帮助我解决此问题。

QA *_*ist 14

基本上有两种不同的方法可以插入记录而不会出现错误:

1) 当 IDENTITY_INSERT 设置为 OFF 时。主键“ID”不得出现

2) 当 IDENTITY_INSERT 设置为 ON 时。主键“ID”必须存在

根据使用 IDENTITY PRIMARY KEY 创建的同一表的以下示例:

CREATE TABLE [dbo].[Persons] (    
    ID INT IDENTITY(1,1) PRIMARY KEY,
    LastName VARCHAR(40) NOT NULL,
    FirstName VARCHAR(40)
);
Run Code Online (Sandbox Code Playgroud)

1) 在第一个示例中,当 IDENTITY_INSERT 为 OFF 时,您可以将新记录插入表中而不会出现错误。主键“ID”不得出现在“INSERT INTO”语句中,并且将自动添加唯一的 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');
Run Code Online (Sandbox Code Playgroud)

表 [dbo].[Persons] 的输出将是:

ID    LastName   FirstName
1     DOE        Jane
2     BROWN      JOE
Run Code Online (Sandbox Code Playgroud)

2) 在第二个示例中,当 IDENTITY_INSERT 为 ON 时,您可以将新记录插入表中而不会出现错误。只要 ID 值尚不存在,主键“ID”就必须出现在“INSERT INTO”语句中:如果在这种情况下 INSERT 中不存在 ID,您将收到错误“Explicit value must be为标识列表指定...”

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'); 
Run Code Online (Sandbox Code Playgroud)

表 [dbo].[Persons] 的输出将是:

ID    LastName   FirstName
1     DOE        Jane
2     BROWN      JOE
3     BLACK      JACK
5     WHITE      JOHN
Run Code Online (Sandbox Code Playgroud)


bms*_*dev 5

你必须做这样的事情

SET IDENTITY_INSERT A_tbl  ON

Insert into B_tbl (uniqueid, Id)
select 1, i.id from inserted

SET IDENTITY_INSERT A_tbl  OFF
Run Code Online (Sandbox Code Playgroud)