使用触发器在第二个表中插入值

时间:2019-06-04 06:09:14

标签: sql-server triggers

我有一个名为[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

3 个答案:

答案 0 :(得分:3)

如果您不打算在Identity列中插入值,则不需要set identity_insert on。另外,如果您松开set identity_insert,当前的插入语句将只在FridgeTemperture表上成功完成的所有插入语句的单个空行内。
使用触发器时,您可以通过自动生成的称为inserteddeleted的表访问由触发触发器的语句所影响的记录。
我想你是在追求这样的事情:

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]表中varcharMpSensors。尝试这样:

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