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

Kal*_*lec 1 sql-server triggers sql-insert

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

然而,这不起作用.

CREATE TRIGGER ModDate
    ON X
    AFTER INSERT, UPDATE
AS
BEGIN

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

END 
Run Code Online (Sandbox Code Playgroud)

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

jpw*_*jpw 9

您需要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 
Run Code Online (Sandbox Code Playgroud)

就像@ZoharPeled正确地在下面的评论中指出的那样,触发器更新插入日期并没有多大意义 - 最好将其getdate()用作列上的默认值(InsertedDate如果要跟踪时,甚至可以作为另一列使用记录最初创建)并且触发器仅ModifiedDate在更新后修改列.

有关已插入已删除表的更多信息,请参阅文档.