You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

触发器完全失效:审批考勤编辑请求后未更新考勤表

触发器失效的原因及修复方案

首先,咱们先揪出问题的核心——你写的触发器里的UPDATE语句有语法逻辑错误!

你原来写的这行更新代码:

UPDATE attendence set start_time = NEW.start_time and end_time=NEW.end_time where id = NEW.attendence_id;

这里的and是逻辑运算符,不是用来分隔多个字段赋值的符号。MySQL会把NEW.start_time and end_time=NEW.end_time当成一个布尔表达式计算,最终把这个表达式的结果(0或1)赋值给start_time,而end_time根本不会被更新。更糟的是,这个逻辑表达式的结果大概率是0,导致你看似执行了更新,但实际是把start_time改成了无效的时间值,end_time完全没变化,这就造成了你觉得“触发器没生效”的错觉。

另外还要确认你的触发器触发时机和绑定表是否正确:必须确保触发器绑定在editattendencerequest表上,触发事件是AFTER UPDATE——只有当请求的status被更新后,才需要同步考勤表的数据。

修复后的完整触发器代码

DELIMITER //
CREATE TRIGGER update_attendance_on_approval
AFTER UPDATE ON editattendencerequest
FOR EACH ROW
BEGIN
    -- 仅当status从未批准状态变为批准状态时执行更新
    IF OLD.status != 'Approved' AND NEW.status = 'Approved' THEN
        UPDATE attendence 
        SET start_time = NEW.new_start_time, end_time = NEW.new_end_time 
        WHERE id = NEW.attendence_id;
    END IF;
END //
DELIMITER ;

额外注意事项

  1. 字段名校验:确认editattendencerequest表的新时间字段确实是new_start_time和new_end_time(和你问题描述一致),别写错字段名导致更新失败。
  2. 权限检查:确保执行触发器的数据库用户拥有attendence表的更新权限,否则触发器会静默失败。
  3. 分步测试:可以先手动执行这条UPDATE语句,验证是否能正常更新考勤表,排除SQL本身的问题后,再测试触发器的触发逻辑。

内容的提问来源于stack exchange,提问作者niceman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:55:18