|
|
-- 文件名:triggers.sql
|
|
|
-- 这是为员工考勤管理系统编写的触发器创建脚本
|
|
|
|
|
|
DELIMITER //
|
|
|
|
|
|
-- 1. 触发器:trg_before_insert_attendance
|
|
|
-- 需求:在插入考勤记录前,自动计算工作时长和加班时长
|
|
|
CREATE TRIGGER trg_before_insert_attendance
|
|
|
BEFORE INSERT ON Attendance
|
|
|
FOR EACH ROW
|
|
|
BEGIN
|
|
|
DECLARE work_duration INT;
|
|
|
DECLARE overtime_duration INT;
|
|
|
|
|
|
-- NULL 检查
|
|
|
IF NEW.CheckInTime IS NULL OR NEW.CheckOutTime IS NULL THEN
|
|
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '上班时间或下班时间不能为空';
|
|
|
END IF;
|
|
|
|
|
|
-- 计算工作时长 (下班时间 - 上班时间),单位为小时
|
|
|
SET work_duration = TIMESTAMPDIFF(MINUTE, NEW.CheckInTime, NEW.CheckOutTime) / 60;
|
|
|
|
|
|
-- 如果工作时长大于8小时,计算加班时长
|
|
|
IF work_duration > 8 THEN
|
|
|
SET overtime_duration = work_duration - 8;
|
|
|
SET NEW.OvertimeHours = overtime_duration;
|
|
|
ELSE
|
|
|
SET NEW.OvertimeHours = 0;
|
|
|
END IF;
|
|
|
|
|
|
SET NEW.WorkingHours = work_duration;
|
|
|
END //
|
|
|
|
|
|
-- 2. 触发器:trg_after_update_leave_status
|
|
|
-- 需求:当假期申请的状态被更新为“已批准”时,自动更新员工的状态为“休假”
|
|
|
CREATE TRIGGER trg_after_update_leave_status
|
|
|
AFTER UPDATE ON LeaveRequest
|
|
|
FOR EACH ROW
|
|
|
BEGIN
|
|
|
-- 如果请假申请已批准,且员工当前状态不是“休假”
|
|
|
IF NEW.RequestStatus = '已批准' AND (SELECT EmploymentStatus FROM Employee WHERE EmployeeID = NEW.EmployeeID) != '休假' THEN
|
|
|
UPDATE Employee
|
|
|
SET EmploymentStatus = '休假'
|
|
|
WHERE EmployeeID = NEW.EmployeeID;
|
|
|
END IF;
|
|
|
END //
|
|
|
|
|
|
-- 3. 触发器:trg_before_insert_performance_appraisal
|
|
|
-- 需求:在插入绩效考核记录前,确保绩效评分为合法值(例如:0到100之间)
|
|
|
CREATE TRIGGER trg_before_insert_performance_appraisal
|
|
|
BEFORE INSERT ON PerformanceAppraisal
|
|
|
FOR EACH ROW
|
|
|
BEGIN
|
|
|
-- 如果绩效评分不在0到100之间,抛出错误
|
|
|
IF NEW.ReviewScore < 0 OR NEW.ReviewScore > 100 THEN
|
|
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '绩效评分必须在0到100之间';
|
|
|
END IF;
|
|
|
END //
|
|
|
|
|
|
-- 4. 触发器:trg_after_insert_employee
|
|
|
-- 需求:当插入新员工记录时,自动创建一个默认的用户登录记录
|
|
|
CREATE TRIGGER trg_after_insert_employee
|
|
|
AFTER INSERT ON Employee
|
|
|
FOR EACH ROW
|
|
|
BEGIN
|
|
|
-- 插入新的用户登录记录
|
|
|
INSERT INTO UserLogin (EmployeeID, Username, Password, AccountStatus)
|
|
|
VALUES (NEW.EmployeeID, CONCAT('user_', NEW.EmployeeID), 'default_password', '有效');
|
|
|
END //
|
|
|
|
|
|
-- 5. 触发器:trg_before_delete_attendance
|
|
|
-- 需求:在删除考勤记录前,检查是否存在未处理的加班记录。如果有,则不允许删除该记录
|
|
|
CREATE TRIGGER trg_before_delete_attendance
|
|
|
BEFORE DELETE ON Attendance
|
|
|
FOR EACH ROW
|
|
|
BEGIN
|
|
|
-- 检查该记录是否存在加班时长
|
|
|
IF OLD.OvertimeHours > 0 THEN
|
|
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '存在未处理的加班时长,不能删除考勤记录';
|
|
|
END IF;
|
|
|
END //
|
|
|
|
|
|
|
|
|
DELIMITER ;
|