【发布时间】:2015-02-28 12:53:00
【问题描述】:
我在使用视图上的 SQL 触发器时遇到问题。我有一个名为 Absence 的表,如下所示:
CREATE TABLE Absence
(
absence_id_pk varchar(6) NOT NULL,
staff_id_fk varchar(6),
start_date date,
end_date date,
reason varchar(30),
PRIMARY KEY (absence_id_pk),
FOREIGN KEY (staff_id_fk) REFERENCES Full_Time_Employee(staff_id_fk)
);
记录员工缺勤时间。
问题来了!我想创建一个触发器,当员工的总缺勤天数大于 20 时向 DBMS 发送消息,例如哎呀!这位员工请了太多病假。实际上,它可能会根据一段时间进行检查,例如在过去 6 个月内,但这不需要那么复杂。仅当在缺勤表中插入新记录时总缺勤时间超过 20 天。
在阅读了一些 cmets 之后,我制作了这个新触发器:
create or replace TRIGGER absence_check
BEFORE INSERT
ON absence
FOR EACH ROW
DECLARE
staffid absence.staff_id_fk%TYPE;
days number;
BEGIN
SELECT SUM(end_date - start_date) INTO days
FROM absence
WHERE staff_id_fk = staffid;
IF days > 20
THEN
DBMS_OUTPUT.PUT_LINE('Total days absent are more than 20' || staffid);
END IF;
END;
任何建议/指导/解决方案将不胜感激!如果消息可以打印出刚刚违反 > 20 天缺勤规则的staff_id_fk,那将是一个奖励。
附:我是一名大学生,虽然这可以通过其他方式实现,但我们被要求尝试为我们的数据库场景创建触发器!
【问题讨论】:
-
在表
absence上创建一个insert触发器。在这种情况下,您为什么要插入视图? -
你似乎有这个工作yesterday,你现在让它比你的评论复杂得多?您假设插入的人/无论做什么都在使用 dbms_output 缓冲区做任何事情,但通常情况并非如此。并且插入的人对信息做了一些事情,并且不能插入到基表中。检查所有员工的计划(每月?)工作,例如,电子邮件 HR 可能更适合这种事情?
-
P.S. The record can still be inserted if the absence is > 20 days. I just want the warning message output.那么最好的办法是创建一个预定的作业——每小时、每天、每月或其他——而不是触发器。 -
投票以重复关闭,因为这可能是对您在同一主题上的其他问题的编辑。
-
@DavidFaber 你是对的。我应该从昨天开始继续我的话题! >.