用于查看的Oracle SQL触发器

用于查看的Oracle SQL触发器,sql,oracle,view,triggers,Sql,Oracle,View,Triggers,我在视图上使用SQL触发器时遇到问题。我有一张叫做缺席的桌子,就像这样: 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_T

我在视图上使用SQL触发器时遇到问题。我有一张叫做缺席的桌子,就像这样:

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发送一条消息,例如Eek!这个职员请了太多病假。实际上,可能会对照一段时间进行检查,例如在过去6个月内,但这并不需要那么复杂。在缺勤表中插入新记录后,缺勤总时间超过20天

在阅读了一些评论之后,我提出了这个新的触发点:

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天缺勤规则的员工id,那将是一个额外的奖励

另外,我是一名大学生,虽然这可以通过其他方式实现,但我们被要求尝试为我们的数据库场景创建触发器

create or replace TRIGGER absence_check
BEFORE INSERT
ON absence
FOR EACH ROW
DECLARE
staffid absence.staff_id_fk%TYPE := :NEW.staff_id_fk;
days number;
BEGIN
SELECT SUM(end_date - start_date) INTO days
FROM Absence, Staff 
WHERE Absence.staff_id_fk = staffid;
IF days > 20
THEN
DBMS_OUTPUT.PUT_LINE('Warning: Total number of days absent is more than 20 for staff member: ' || staffid);
END IF;
END;

谢谢大家的帮助和建议。当你终于解决了一个问题时,感觉很棒。我在你的帮助下探索了这个问题,学到了很多关于触发器的知识。

在表上创建一个插入触发器。在这种情况下,您为什么要插入视图?您似乎已经让它工作了,并且您现在已经使它比您的评论复杂得多了?您假设插入的对象是dbms_输出缓冲区,而事实往往并非如此。任何插入的人都会对信息进行处理,并且不能插入到基表中。预定的月刊?检查所有员工的工作,比如电子邮件,人力资源部可能更适合这种情况?另外,如果缺勤时间超过20天,记录仍然可以插入。我只想输出警告消息。那么,最好的办法是创建一个计划作业——每小时、每天、每月或任何时间——而不是触发。投票以重复的方式结束,因为这可能是对同一主题的其他问题的编辑。@Davidaber你是对的。我应该从昨天开始继续我的帖子!>如果这个关闭,我将继续在那里寻找答案。另外,我不知道计划的工作。我对触发器还不熟悉,我们只有一次关于触发器的简短讲座,我想让一些触发器作为我大学作业的额外任务。