2015-02-23 74 views
0

发射扳机我的问题如下:避免另一个触发在MYSQL

  • 表A中包含“任务”
  • 表B中包含“TaskProgress”的列表 - 只是一个大约花费在任务时间的信息,用户ID,任务ID和注意

在表A(任务),我有触发,这将更新上次更改的日期时间 - 列DateChanged(为了捕捉编辑的日期时间由用户制造)

表B(TaskProgress)我有触发,这将更新花费在任务总时间(和所有时间内给予TASK_ID和更新列TOTALTIME表A)

我希望在表A中,只有当用户mades更新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 40年5月5日

感谢,兹比涅克

+0

用户更新任务是否涉及修改TimeReal列? – Mihai 2015-02-23 12:06:23

+0

不,用户不应该更新TimeReal,我想避免发送时间从客户机到服务器 – Zbynek 2015-02-23 12:29:35

回答

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 ; 
+0

太棒了!简单并且不需要设置全局变量等 – Zbynek 2015-02-23 12:32:44