如何制作一个不允许STAFF连续两年以上在同一个UNIT中教学的触发器。我使用了帽子,因为它们是我需要使用的3个属性。我想我知道我应该做什么,但不知道如何实现它。我在想是否可以使用计数器来计算一个工作人员教过某个UNIT多少年,如果它超过2但是它会引发错误,但是我坚持执行它。
CREATE TRIGGER CONSECUTIVE_TEACHING
BEFORE INSERT ON TEACHING_INFORMATION
FOR EACH ROW
DECLARE
s_id char;
c_id char;
t_yr number;
BEGIN
SELECT COUNT (TEACHING_INFORMATION.STAFFID, TEACHING_INFORMATION.COURSEID,
TEACHING_INFORMATION.YEAR)
INTO
s_id, c_id, t_yr
FROM TEACHING_INFORMATION
WHERE
我不确定在'WHERE'部分输入什么,因为我在这里处理3个变量。这里需要澄清一下。
提前致谢。
答案 0 :(得分:0)
您想知道这位员工在过去两年中教授这门课程多少年了。如果答案是2,请不要允许。
select count(*)
from TEACHING_INFORMATION
into t_yr
where STAFFID = :new.STAFFID
and COURSEID = :new.COURSEID
and YEAR between :new.YEAR - 2 and :new.YEAR - 1;
因此,如果这一年是2016年,它将计算员工在2014年至2015年之间教授该课程的次数。也就是说,如果课程是在前两年教授的,那么结果将是两次。不幸的是,你可能最终会抱怨一个变异的表格。
另一种方法是使用视图在表格前面,让应用程序只访问视图。然后,您的触发器将是视图上的而不是触发器,因此不会遇到变异表问题。如果查询结果返回0或1,则视图触发器本身将对表执行INSERT。