在复制导致SQL Server

时间:2016-03-17 04:19:16

标签: sql sql-server database ssms database-replication

我的数据库中有一个表A_tbl。我在A_tbl上创建了一个触发器来捕获插入的记录。触发器正在我的队列表B_tbl中插入记录。此表有一个Identity列,其属性“Not for replication”为1。

  • A_tbl(ID,名称,值),Id为主键
  • B_tbl(uniqueId,Id),uniqueIdIdentity

执行此操作的触发器代码:

Insert into B_tbl (Id)
    select i.Id from inserted

现在我的表'B'被复制到另一个数据库服务器,现在当我插入表'A'时,它导致了这个错误:

  

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

请帮我解决这个问题。

3 个答案:

答案 0 :(得分:4)

你必须做这样的事情

SET IDENTITY_INSERT A_tbl  ON

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

SET IDENTITY_INSERT A_tbl  OFF

答案 1 :(得分:2)

触发器代码应包含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

答案 2 :(得分:2)

在没有错误的情况下,INSERT记录基本上有两种不同的方法:

1)当IDENTITY_INSERT设置为OFF时。 PRIMARY KEY " ID"绝不能存在

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时,您可以在表中插入新记录而不会出现错误。 PRIMARY KEY " 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');

表[dbo]的输出。[人员]将是:

ID    LastName   FirstName
1     DOE        Jane
2     BROWN      JOE

2)在第二个示例中,您可以在IDENTITY_INSERT为ON时将新记录插入表中而不会出现错误。 PRIMARY KEY " ID"必须出现来自" INSERT INTO"语句只要ID值不存在:如果在这种情况下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