【问题标题】:Trigger on insert and update that adds modification date触发插入和更新以添加修改日期
【发布时间】:2015-05-13 09:02:01
【问题描述】:

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

但这不起作用。

CREATE TRIGGER ModDate
    ON X
    AFTER INSERT, UPDATE
AS
BEGIN

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

END 

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

【问题讨论】:

  • 当然是创建一个新行,你有一个 INSERT 语句。如果要拦截插入和/或更新以更改其中一个值,则需要使用 INSTEAD 触发器。然后要处理多行操作,您需要创建触发器代码,以便它引用插入的虚拟表。我建议使用两个触发器而不是一个。或者更好的办法是把这个逻辑放在你的程序中。
  • @SeanLange 我如何将这个逻辑放在我的“程序”中?
  • 我假设您使用更新和插入过程,但情况可能并非如此。 :)

标签: sql-server triggers sql-insert


【解决方案1】:

您需要在触发器中加入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 列。

有关 inserteddeleted 表的更多信息,请参阅documentation

【讨论】:

  • 另外,我不会使用 Insert 触发器来设置 ModifiedDate 列的值,而只需将其默认值设置为 GETDATE()。
  • @ZoharPeled 是的,这听起来是个好主意。 @jpw 谢谢,如果我决定将 GETDATE() 设为默认值,我认为这仅适用于 UPDATE ?
  • 默认值仅适用于插入。您仍然需要更新触发器
  • @ZoharPeled 是的,我明白了。我已经进行了我正在谈论的修改并对其进行了测试(它有效),但我会改写:如果我只修改UPDATE 的触发器,并为ModifiedDate 添加默认的GETDATE(),它应该可以类似地工作?它确实如此,只是更好。再次感谢!
【解决方案2】:
CREATE TRIGGER ModDate
    ON TableX
    FOR INSERT, UPDATE
AS
BEGIN
    UPDATE TableX 
    SET ModifiedDate = GETDATE()
    WHERE Id = (Select Id from Inserted)
END 

【讨论】:

    【解决方案3】:

    如果您在插入数据上没有键,并且您没有使用 sql 命令在 modifieddate 列上添加默认值,则可以在 modifieddate 列为空的情况下获取插入触发器:

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

    【讨论】:

      猜你喜欢
      • 2015-09-04
      • 1970-01-01
      • 2018-11-25
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多