插入和更新时触发添加修改日期

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了插入和更新时触发添加修改日期相关的知识,希望对你有一定的参考价值。

我正在制作一个包含姓名,电子邮件等的简单表格,但我也有一个ModifiedDate。我的想法是在插入和更新后使用触发器,并插入当前日期。因此,如果任何人对该列做任何事情(除了删除),日期应该反映出来。

然而,这不起作用。

CREATE TRIGGER ModDate
    ON X
    AFTER INSERT, UPDATE
AS
BEGIN

    INSERT INTO X (ModifiedDate)
    VALUES (GETDATE())

END 

现在我有几个不能为null的值,这似乎是尝试创建一个新行。我希望它将日期插入当前正在执行的行中,我不知道如何。如果我一次添加5行怎么办?

答案

您需要在触发器中加入inserted虚拟表,以将更新的行限制为实际更改的行。试试这个:

CREATE TRIGGER ModDate
    ON TableX
    AFTER INSERT, UPDATE
AS
BEGIN
    UPDATE X 
    SET ModifiedDate = GETDATE()
    FROM TableX X
    JOIN inserted i ON X.key = i.key -- change to whatever key identifies 
                                     -- the tuples
END 

就像@ZoharPeled正确地在下面的评论中指出的那样,触发更新插入日期真的没什么意义 - 最好使用getdate()作为列的默认值(或者甚至作为另一列InsertedDate,如果你想跟踪何时最初创建记录)并且触发器仅在更新后修改ModifiedDate列。

有关插入和删除表的更多信息,请参阅documentation

另一答案

如果您没有插入数据上的键,并且您没有在sql的命令中添加修改日期列的默认值,则可以获取插入触发器,其中修改日期列为null:

CREATE TRIGGER ModDate
ON TableX
AFTER INSERT
AS
BEGIN
UPDATE tableX  SET ModifiedDate = GETDATE() where modifieddate is null
END
另一答案

表名:x 触发器名称:ModDate 在表中插入或更新后更新的字段:ModifiedDate

create trigger [dbo].[ModDate] on [dbo].[x] after insert,update
as
begin

UPDATE dbo.x
   SET x.ModifiedDate = GETDATE()
  FROM x X
  JOIN inserted I ON X.key = I.key

end

以上是关于插入和更新时触发添加修改日期的主要内容,如果未能解决你的问题,请参考以下文章

mysql关于触发器怎么判断数据存在时更新不存在时添加呢!

如何知道我在 SQL Server 中使用插入触发器的最后日期?

Oracle 触发器将所有插入/更新写入文件

触发器处理表更新

Oracle:更新时自动修改日期

MySQL触发器在插入或更新之前将日期值更改为weekstart