sql-server - 触发添加修改日期的插入和更新

标签 sql-server triggers sql-insert

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

然而,这是行不通的。

CREATE TRIGGER ModDate
    ON X
    AFTER INSERT, UPDATE
AS
BEGIN

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

END 

现在我有几个不能为空的值,这似乎是尝试创建一个新行。我希望它将日期插入当前正在执行的行中,但我不知道如何。如果我一次添加 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-server - 触发添加修改日期的插入和更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28988885/

相关文章:

sql-server - 读取派生列表达式

sql - 遍历 SQL Server 中的 XML 列

java - 发现异常后继续执行

mysql - 在 mysql 中插入 150K 行需要多长时间?

带条件的 MySQL 更新触发器

php - 将数据从php插入数据库mysql表

sql-server - 从平面文件重定向 NULL 或空白值

sql-server - 将 INT 转换为 BIT 的最佳方法

javascript - 如果元素在 jQuery 中将类从一个特定更改为另一个

sql - postgresql 中的 ROLLBACK 事件触发器