使用自动增量字段插入表中

时间:2015-07-23 15:37:41

标签: sql-server-2008 auto-increment

我有两个名为HRData和HRDataHistory的表。 HRDataHistory与HRData具有相同的结构,除了第一列是自动增量字段,最后一列是DateTime字段。

HRData有一个触发器:

CREATE TRIGGER [HR].[HRData_History]
ON [HR].[HRData]
AFTER INSERT, UPDATE 
AS 
    INSERT INTO HR.HRDataHistory
    SELECT *, GETDATE() 
    FROM inserted
;

GO

这适用于现有的开发机器。我试图在我的本地SQL服务器实例上镜像这种关系,以便我可以测试一些更改。使用SSMS我使用'Script Table as Create To ...'并在我的本地sql server实例上创建了每个表和索引的结构。但是,当我为触发器执行此操作时,我收到以下错误:

An explicit value for the identity column in table 'HR.HRDataHistory' can only be specified when a column list is used and IDENTITY_INSERT is ON.

我知道首选的方法是指定列,但我想镜像当前没有这样做的生产,并且我想要了解它为什么在生产中工作而不是在我的测试数据库中。

1 个答案:

答案 0 :(得分:0)

您收到此错误是因为您尝试将数据插入IDENTITY列,每当您在该表中插入另一行时,该列会自动填充。

在我的头顶,你可以做类似下面的事情(虽然我相信有更优雅的解决方案和我不保证这是一个安全的解决方案,我也没有尝试这样的东西,我建议在尝试生产/实时之前在TEST数据库上进行测试:

  • 向HRDataHistory表添加另一列,该表没有设置标识(因为一旦设置就无法从列中删除标识),但必须与当前标识(IDENTITY)列具有相同的数据类型
  • 使用UPDATE查询将您的IDENTITY列中的所有ID移至新列:

    UPDATE HRDataHistory
    SET new_column = ID
    
  • 删除IDENTITY列(但如果您在其上设置任何FK以及可能使用其他对象,这可能会产生严重影响):

    ALTER TABLE HRDataHistory
    DROP COLUMN ID
    
  • 将“new_column”重命名为您之前IDENTITY列的名称:

    EXEC sp_RENAME 'HRDataHistory.new_column' , 'ID', 'COLUMN'
    

此时我相信您可以使用触发器将HRData表中新插入的数据“复制”到HRDataHistory,因为列名称应匹配且不再有冲突到期到IDENTITY

同样,这可能(不保证)有效,所以我建议您先检查TEST环境