用于视图的 Oracle SQL 触发器
Posted
技术标签:
【中文标题】用于视图的 Oracle SQL 触发器【英文标题】:Oracle SQL Trigger for View 【发布时间】: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 你是对的。我应该从昨天开始继续我的话题! >.
【参考方案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;
感谢大家的帮助和建议。当你终于解决了一个问题时,我感觉很棒,通过在你的帮助下探索这个问题,我学到了很多关于触发器的知识。
【讨论】:
以上是关于用于视图的 Oracle SQL 触发器的主要内容,如果未能解决你的问题,请参考以下文章
银行储蓄管理系统---Oracle数据库表结构视图触发器序列函数过程等的sql文件---Bank_Oracle.sql