【发布时间】:2016-11-02 04:15:53
【问题描述】:
我正在创建一个触发器,该触发器在对表 TEACHING_INFORMATION 进行插入或更新时起作用,本质上我只是获取输入的年份字段并确保同一个人没有相同的课程前一年,如果他们不允许。我正在使用 :NEW 值将现有数据与输入的数据进行比较,但是出现错误(位于下方)。这是我完成的代码:
CREATE OR REPLACE TRIGGER TRIGGER1
AFTER INSERT OR UPDATE OF YEAR ON TEACHING_INFORMATION
DECLARE requestedyear TEACHING_INFORMATION.YEAR%type;
pragma autonomous_transaction;
BEGIN
SELECT year INTO requestedyear FROM TEACHING_INFORMATION WHERE staffID = :NEW.staffID AND COURSEID = :NEW.courseID;
IF (:NEW.year = requestedyear + 1) THEN
RAISE_APPLICATION_ERROR(-20250, 'Cannot teach the same class for 2 consecutive years');
END IF;
END;
错误:
ORA-04082: NEW or OLD references not allowed in table level triggers
我尝试将FOR EACH ROW 条件添加到触发器中,但这不起作用,因为发生另一个错误,表明它正在查看太多行,而我实际上只需要查看一个。由于我是触发器的新手,因此我的逻辑可能与此相去甚远,但我们将不胜感激任何正确方向的帮助/指导。
【问题讨论】:
-
这种逻辑在执行
insert的存储过程中比在触发器中更有意义。如果你真的非常想使用触发器,你需要一个包含键集合的包,一个将:new值放入集合的行级触发器,然后是一个遍历集合的语句级触发器确定是否有任何行违反您的规则。需要处理很多动人的部分。 -
不幸的是,这是一个需要使用触发器的任务,这很痛苦