sql-server - 使用触发器在第二个表中插入值
问题描述
我有一个名为 [FridgeTemperture] 的表,当插入任何记录时,它应该在新表 MpSensors 中添加一个值。但是插入记录时不会将记录插入新表中。
错误
必须为表“MpSensors”中的标识列指定显式值,或者将标识插入设置为 ON,或者当复制用户插入非复制标识列时。
CREATE TRIGGER [dbo].[FridgeTemperature_INSERT]
ON [dbo].[FridgeTemperture]
AFTER INSERT
AS
BEGIN
SET IDENTITY_INSERT MpSensors ON;
SET NOCOUNT ON;
DECLARE @fridge_temp varchar(10)
INSERT INTO MpSensors(fridge_temp)
VALUES(@fridge_temp)
SET IDENTITY_INSERT MpSensors OFF;
END
GO
表模式
CREATE TABLE [dbo].[MpSensors](
[id] [int] IDENTITY(1,1) NOT NULL,
[fridge_temp] [varchar](10) NULL
) ON [PRIMARY]
CREATE TABLE [dbo].[FridgeTemperture](
[Id] [int] IDENTITY(1,1) NOT NULL,
[ShopId] [nvarchar](4) NULL,
[Fridgetemp] [decimal](4, 2) NOT NULL,
[UpdatedDate] [datetime2](7) NOT NULL
GO
解决方案
set identity_insert on
如果您不尝试将值插入标识列,则不需要。此外,如果您松开 , 您当前的插入语句set identity_insert
将简单地在一个空行中,用于在FridgeTemperture
表上成功完成的任何插入语句。
使用触发器时,您可以通过名为inserted
and的自动生成表访问由触发触发器的语句影响的记录deleted
。
我想你在追求这样的事情:
CREATE TRIGGER [dbo].[FridgeTemperature_INSERT]
ON [dbo].[FridgeTemperture]
AFTER INSERT
AS
BEGIN
INSERT INTO MpSensors(fridge_temp)
SELECT CAST(Fridgetemp as varchar(10))
FROM inserted
END
尽管我真的看不出将相同的值存储在两个不同的位置和两种不同的数据类型中的任何好处。
更新
按照我们在评论中的对话,您可以简单地在触发器中使用更新语句而不是插入语句:
UPDATE MpSensors
SET fridge_temp = (
SELECT TOP 1 CAST(Fridgetemp as varchar(10))
FROM inserted
ORDER BY Id DESC
)
这应该为您提供最新的记录,以防您有一个插入语句FridgeTemperture
在单个语句中将多条记录插入到表中。