将数据插入另一个表时触发以更新带有时间戳的表

Posted

技术标签:

【中文标题】将数据插入另一个表时触发以更新带有时间戳的表【英文标题】:Trigger to update a table with timestamp when data is inserted into another table 【发布时间】:2018-11-28 03:55:12 【问题描述】:

我对触发器很陌生。在这里需要帮助。

我有两张桌子,[dbo].[Demand_Request][dbo].[Modified_Demand_Request]

CREATE TABLE [dbo].[Demand_Request] 
(
    [CASE_ID] [INT] NULL,
    [TE_PART_NUMBER] [NVARCHAR](50) NULL,
    [VALUE] [FLOAT] NULL,
    [DEMAND_DATE] [DATETIME] NULL
) 

CREATE TABLE [dbo].[Modified_Demand_Request] 
(
    [CASE_ID] [INT] NULL,
    [TE_PART_NUMBER] [NVARCHAR](50) NULL,
    [VALUE] [FLOAT] NULL,
    [DEMAND_DATE] [DATETIME] NULL,
    [Modified_On] [DATETIME] NULL
) 

当数据插入[dbo].[Demand_Request] 时,我想将相同的数据与时间戳一起添加到表[dbo].[Modified_Demand_Request] 中。

下面是我的触发器,但它不起作用:

CREATE TRIGGER [dbo].[Modified_Demand_Request1]
ON [dbo].[Demand_Request]
AFTER UPDATE
AS
     INSERT INTO [dbo].[Modified_Demand_Request] ([CASE_ID], [TE_PART_NUMBER],[VALUE], [DEMAND_DATE], [Modified_On])
         SELECT 
             [CASE_ID], [TE_PART_NUMBER], [VALUE],
             [DEMAND_DATE], GETDATE()
         FROM 
             INSERTED

【问题讨论】:

您的触发器被定义为after update,因此它不会在insert 上触发。为此,您需要after insert, update Sql Server trigger insert values from new row into another table的可能重复 【参考方案1】:

我想知道您是如何插入数据的。我尝试了与下面相同的方法(使用“FOR INSERT”触发器)并且能够获取 Modified_Demand_Request 表中的数据。

    insert into [Demand_Request] values(1,'Test',1.0,GETDATE())
    insert into [Demand_Request] values(2,'Test1',1.0,GETDATE())
    insert into [Demand_Request] values(3,'Test2',1.0,GETDATE())
    insert into [Demand_Request] values(14,'Test2',1.0,GETDATE())

【讨论】:

【参考方案2】:

试试这个FOR INSERT

Create Trigger [dbo].[Modified_Demand_Request1]
   on [dbo].[Demand_Request]
   FOR INSERT
   AS
     Insert Into[dbo].[Modified_Demand_Request] ([CASE_ID],[TE_PART_NUMBER],[VALUE],[DEMAND_DATE],[Modified_On])
       SELECT [CASE_ID],[TE_PART_NUMBER],[VALUE],[DEMAND_DATE],GETDATE()
       FROM INSERTED

用于演示REXTESTER

额外参考:Firing Trigger for Bulk Insert

【讨论】:

@parthaburagohain 我已经用演示链接更新了答案,我希望它能按预期工作,你能详细说明你的问题吗? 嗨,当我尝试插入一行时,触发器起作用。但是当我为多行运行它时,它不起作用..如何使用批量插入来实现? @parthaburagohain 插入多行时会发生什么?代码看起来是正确的,因为它是从包含所有插入行的 inserted 中选择的。 当我尝试插入多行时,不会从基表中复制任何内容。 嗯...可能需要进行一些调查...如果您从 SSMS 插入数据并从中找出发生了什么/没有发生什么,您可以使用 select 语句和 print 语句调试触发器。

以上是关于将数据插入另一个表时触发以更新带有时间戳的表的主要内容,如果未能解决你的问题,请参考以下文章

如何在 InfluxDB 中编辑测量值(= 带有时间戳的值集)?

插入另一个表时的MySQL触发器问题

创建 SQL 触发器以更新另一个表时出错

根据另一列中的更改创建带有时间戳的最后修改列

将具有当前时间戳的列添加到 Hive 中的表

比较 2 个配置单元表以查找没有任何唯一列/时间戳的更新/插入/删除记录并将其附加到 Hadoop 中的基表