我有一个名为[FridgeTemperture]的表,当插入任何记录时,它应该在新表MpSensors中添加一个值。但是,插入记录后,记录不会被插入到新表中。
错误
必须为表中的标识列指定显式值 “ MpSensors” identity_insert设置为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
答案 0 :(得分:3)
如果您不打算在Identity列中插入值,则不需要set identity_insert on
。另外,如果您松开set identity_insert
,当前的插入语句将只在FridgeTemperture
表上成功完成的所有插入语句的单个空行内。
使用触发器时,您可以通过自动生成的称为inserted
和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
表中,那么这应该为您提供最新记录。
答案 1 :(得分:1)
您需要使用带有CAST的Select语句,因为在触发器的[fridge_temp]
表中varchar
是MpSensors
。尝试这样:
CREATE trigger <table_name>
ON <table_name>
AFTER Insert
AS
BEGIN
INSERT INTO <table_name>(column_name)
Select CAST(column_name as varchar(10))
FROM inserted
END
插入的表在INSERT和UPDATE语句期间存储受影响的行的副本。在插入或更新事务期间,新行将同时添加到插入表和触发器表中。插入表中的行是触发器表中新行的副本。
答案 2 :(得分:0)
create TRIGGER [dbo].[FridgeTemperature_INSERT]
ON [dbo].[FridgeTemperture]
AFTER INSERT
AS
BEGIN
UPDATE MpSensors
SET fridge_temp = CAST(Fridgetemp as varchar(10))
FROM inserted
END