我有两个名为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.
我知道首选的方法是指定列,但我想镜像当前没有这样做的生产,并且我想要了解它为什么在生产中工作而不是在我的测试数据库中。
答案 0 :(得分:0)
您收到此错误是因为您尝试将数据插入IDENTITY
列,每当您在该表中插入另一行时,该列会自动填充。
在我的头顶,你可以做类似下面的事情(虽然我相信有更优雅的解决方案和我不保证这是一个安全的解决方案,我也没有尝试这样的东西,我建议在尝试生产/实时之前在TEST数据库上进行测试:
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环境。