【问题标题】:Oracle SQL Trigger for View用于视图的 Oracle SQL 触发器
【发布时间】: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 你是对的。我应该从昨天开始继续我的话题! >.

标签: sql oracle view triggers


【解决方案1】:
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;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 2015-03-26
    相关资源
    最近更新 更多