【问题标题】:Insert values in second table using triggers使用触发器在第二个表中插入值
【发布时间】:2019-06-04 15:21:25
【问题描述】:

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

【问题讨论】:

    标签: sql-server triggers


    【解决方案1】:

    如果您不尝试将值插入标识列,则不需要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
    

    虽然我真的看不出将相同的值存储在两个不同的位置和两种不同的数据类型有什么好处。

    更新

    根据我们在 cmets 中的对话,您可以简单地在触发器中使用更新语句而不是插入语句:

    UPDATE MpSensors
    SET fridge_temp = (
        SELECT TOP 1 CAST(Fridgetemp as varchar(10)) 
        FROM inserted
        ORDER BY Id DESC
    )
    

    这应该会为您提供最新的记录,以防您有一个插入语句在单个语句中将多条记录插入到 FridgeTemperture 表中。

    【讨论】:

    • 我有一张分析表和一张最新表。因此,当我想显示仪表板时,我不想通过 q​​uerieng last 1 从分析数据中获取数据。当插入完成时,我想更新最新的表。
    • 这意味着如果找到记录,您只想更新第二个表?
    • 是的,我有一个用于插入记录的 post api。在 1 个表中插入一条记录时,应在另一个触发表中更新相同的数据。您的代码工作正常,但我想让它更新而不是插入新记录。每次在第二张表中获得新记录时
    • “我想让它更新而不是插入新记录”所以您在MpSensors 中只有一条记录?不管ShopId?这仍然没有什么意义。您可以使用简单的查询轻松获取最后一个值,并且使用正确索引的FridgeTemperture 表,即使该表有数百万行,这也应该是一个令人讨厌的快速查询......
    • 实际上我有很多表,例如 frigetemp、室温、门状态。所有最新值都应放在一张表中。所以我做了 3 个触发器,这样我就可以在不同的表中获取一条记录,以便更快地获取数据以显示在我的仪表板中,而不是从多个表中获取数据。
    【解决方案2】:
    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
    

    【讨论】:

      【解决方案3】:

      您需要在触发器的MpSensors 表中使用带有CAST 的Select 语句,因为[fridge_temp]varchar。试试这样:

      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 语句期间存储受影响行的副本。在插入或更新事务期间,新行会同时添加到插入的表和触发器表中。插入表中的行是触发器表中新行的副本。

      【讨论】:

      • 他缺少inserted 自动生成的表格来实现他的目标。如果你向他解释一下inserted表会更好。
      猜你喜欢
      • 1970-01-01
      • 2015-11-16
      • 2020-01-28
      • 2015-01-15
      • 2022-10-22
      • 1970-01-01
      • 1970-01-01
      • 2020-04-27
      • 1970-01-01
      相关资源
      最近更新 更多