繁体   English   中英

SQL触发器-新旧解决方法

[英]SQL Triggers - NEW and OLD workarounds

我正在创建一个触发器,该触发器将在对表TEACHING_INFORMATION进行插入或更新时执行操作,从本质上讲,我只是在输入输入的Year字段,并确保同一个人上一年没有相同的课程,并且如果他们不允许的话。 我正在使用: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条件添加到触发器,但是由于出现另一个错误,表明它正在查看太多行,因此这实际上不起作用,因为我真的只需要查看一行。 由于我是触发器的新手,因此我的逻辑可能会有所偏离,但是朝正确方向的任何帮助/指导将不胜感激。

:NEW和:OLD只能在行级触发器(FOR EACH ROW选项)中使用,因此oracle不知道应采用哪个:NEW。 尝试添加: 每行将new引用为new,而old引用为old 因此,您的代码应如下所示:

CREATE OR REPLACE TRIGGER TRIGGER1 
AFTER INSERT OR UPDATE OF YEAR ON TEACHING_INFORMATION 
referencing new as new old as old for each row
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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM