避免在MYSQL中通过另一个触发器触发触发器

时间:2015-02-23 11:36:03

标签: mysql triggers

我的问题如下:

  • 表A包含"任务"
  • 的列表
  • 表B包含" TaskProgress" - 只是关于在任务,用户ID,任务ID和注释上花费的时间的信息

在表A(任务)上,我有触发器,它更新上次更改的日期时间 - 列DateChanged(用于捕获用户编辑的日期时间)

在表B(TaskProgress)上我有触发器,它会更新在任务上花费的总时间(对于给定的Task_ID和表A中的更新列TotalTime,所有时间总和)

我希望仅在用户进行更新时更新表A中的DateChanged(除非表B上的触发更新TotalTime,否则每次更新)

所以我想知道,在更新另一个触发器中的值时,是否有办法告诉数据库不要触发TRIGGER。

/* set date of last change and date od closing of task */
DELIMITER $$
CREATE TRIGGER before_tasks_update 
BEFORE UPDATE ON tasks
FOR EACH ROW BEGIN
    SET new.DateChanged = NOW();
    IF new.Status_ID = 3 THEN
        SET new.DateClosed = NOW();
    END IF;
END$$
DELIMITER ;

/* set total time spent on task */
DELIMITER $$
CREATE TRIGGER after_taskprogress_insert
AFTER INSERT ON taskprogress
FOR EACH ROW BEGIN
    DECLARE sumtime TIME;
    SET @sumtime := (SELECT SEC_TO_TIME( SUM( TIME_TO_SEC( `timeSpent` ) ) )
        FROM taskprogress WHERE Task_ID = new.Task_ID);
    UPDATE `tasks` SET TimeReal = @sumtime WHERE ID = new.Task_ID;
END $$
DELIMITER ;

我使用MySQL 5.5.40

谢谢,zbynek

1 个答案:

答案 0 :(得分:0)

添加一项检查以验证更新是否意味着新的TimeReal值,因为只有第二个触发器会更新该列。

DELIMITER $$
CREATE TRIGGER before_tasks_update 
BEFORE UPDATE ON tasks
FOR EACH ROW BEGIN
    IF new.TimeReal=old.TimeReal THEN SET new.DateChanged = NOW();
    END IF;
    IF new.TimeReal=old.TimeReal AND new.Status_ID = 3 THEN
        SET new.DateClosed = NOW();
    END IF;
END$$
DELIMITER ;