Oracle SQL 视图触发器
Oracle SQL Trigger for View
我在使用视图上的 SQL 触发器时遇到问题。我有一个名为 Absence 的 table,如下所示:
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 个月内,但这并不需要那么复杂。仅在将新记录插入 Absence table.
时缺勤总天数超过 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;
任何 advice/guidance/solutions 将不胜感激!如果消息能打印出刚刚违反 > 20 天缺席规则的 staff_id_fk,那就更好了。
P.S。我是一名大学生,虽然这可以通过其他方式实现,但我们被要求尝试为我们的数据库场景创建触发器!
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;
感谢大家的帮助和建议。当你终于解决了一个问题时感觉很棒,通过在你的帮助下探索这个问题,我学到了很多关于触发器的知识。
我在使用视图上的 SQL 触发器时遇到问题。我有一个名为 Absence 的 table,如下所示:
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 个月内,但这并不需要那么复杂。仅在将新记录插入 Absence table.
时缺勤总天数超过 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;
任何 advice/guidance/solutions 将不胜感激!如果消息能打印出刚刚违反 > 20 天缺席规则的 staff_id_fk,那就更好了。
P.S。我是一名大学生,虽然这可以通过其他方式实现,但我们被要求尝试为我们的数据库场景创建触发器!
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;
感谢大家的帮助和建议。当你终于解决了一个问题时感觉很棒,通过在你的帮助下探索这个问题,我学到了很多关于触发器的知识。