首页 文章

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

提问于
浏览
1

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

  • A_tbl (Id,name,value),其中 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 回答

  • 3

    你必须做这样的事情

    SET IDENTITY_INSERT A_tbl  ON
    
    Insert into B_tbl (uniqueid, Id)
    select 1, i.id from inserted
    
    SET IDENTITY_INSERT A_tbl  OFF
    
  • 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
    
  • 1

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

    1)当IDENTITY_INSERT设置为OFF时 . PRIMARY KEY "ID" MUST NOT BE PRESENT

    2)当IDENTITY_INSERT设置为ON时 . PRIMARY KEY "ID" MUST BE PRESENT

    根据使用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"语句 and a unique ID value will be added automatically: 的PRIMARY KEY "ID" MUST NOT BE PRESENT . 如果在这种情况下INSERT中存在ID,您将收到错误"Cannot insert explicit value for identify column in table..."

    SET IDENTITY_INSERT [dbo].[Persons] OFF;
    INSERT INTO [dbo].[Persons] (FirstName,LastName)
    VALUES ('JANE','DOE'); 
    INSERT INTO Persons (FirstName,LastName) 
    VALUES ('JOE','BROWN');
    

    OUTPUT of TABLE [dbo].[Persons] will be:

    ID    LastName   FirstName
    1     DOE        Jane
    2     BROWN      JOE
    

    2)在第二个示例中,当IDENTITY_INSERT为ON时,您可以在表中插入新记录而不会出现错误 . 来自"INSERT INTO"语句的PRIMARY KEY "ID" MUST BE PRESENT as long as the ID value does not already exist :如果在这种情况下INSERT中不存在ID,则会出现错误"Explicit value must be specified for identity column table..."

    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');
    

    OUTPUT of TABLE [dbo].[Persons] will be:

    ID    LastName   FirstName
    1     DOE        Jane
    2     BROWN      JOE
    3     BLACK      JACK
    5     WHITE      JOHN
    

相关问题