适用于View的Oracle SQL触发器

时间:2015-02-28 12:53:01

标签: sql oracle view triggers

我在View上遇到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天。

在阅读了一些评论后,我做了这个新的触发器:

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;

任何建议/指导/解决方案将不胜感激!如果消息可以打印出刚违反>的staff_id_fk,那将是一个奖励。没有规则的20天。

P.S。我是一名大学生,虽然可以通过其他方式实施,但我们被要求尝试为我们的数据库场景创建触发器!

1 个答案:

答案 0 :(得分:0)

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;

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