避免在 MYSQL 中被另一个触发器触发
Avoid firing trigger by another trigger in MYSQL
我的问题如下:
- Table 包含 "Tasks"
的列表
- Table B 包含 "TaskProgress" - 只是有关任务花费的时间、用户 ID、任务 ID 和注释的信息
在 table A(任务)上,我有触发器,它更新上次更改的日期时间 - DateChanged 列(旨在捕获用户所做编辑的日期时间)
在 table B (TaskProgress) 上我有触发器,它更新在任务上花费的总时间(给定 Task_ID 的所有时间求和并更新 table A 中的列 TotalTime)
我希望仅在用户进行更新时更新 Table A 中的 DateChanged(这是每次,除非触发 table 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 ;
我用的是MySQL5.5.40
谢谢,zbynek
添加检查以验证更新是否意味着新的 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 ;
我的问题如下:
- Table 包含 "Tasks" 的列表
- Table B 包含 "TaskProgress" - 只是有关任务花费的时间、用户 ID、任务 ID 和注释的信息
在 table A(任务)上,我有触发器,它更新上次更改的日期时间 - DateChanged 列(旨在捕获用户所做编辑的日期时间)
在 table B (TaskProgress) 上我有触发器,它更新在任务上花费的总时间(给定 Task_ID 的所有时间求和并更新 table A 中的列 TotalTime)
我希望仅在用户进行更新时更新 Table A 中的 DateChanged(这是每次,除非触发 table 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 ;
我用的是MySQL5.5.40
谢谢,zbynek
添加检查以验证更新是否意味着新的 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 ;