SQL触发器使连续不超过2

时间:2016-10-29 00:01:51

标签: sql plsql triggers database-trigger

如何制作一个不允许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个变量。这里需要澄清一下。

提前致谢。

1 个答案:

答案 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。