【问题标题】:SQL Triggers - NEW and OLD workaroundsSQL 触发器 - 新的和旧的解决方法
【发布时间】: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 值放入集合的行级触发器,然后是一个遍历集合的语句级触发器确定是否有任何行违反您的规则。需要处理很多动人的部分。
  • 不幸的是,这是一个需要使用触发器的任务,这很痛苦

标签: sql oracle triggers


【解决方案1】:

:NEW 和 :OLD 只能用于行级触发器(FOR EACH ROW 选项),所以 oracle 不知道应该使用哪个 :NEW。尝试添加:每行引用新旧旧。所以你的代码应该是这样的:

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;

【讨论】:

  • REFERENCING NEW AS NEW OLD AS OLD 您可以跳过,因为这是 Oracle 中的默认行为。仅当您更喜欢使用其他参考时才有意义,例如REFERENCING NEW AS NEUER_WERT OLD AS ALTER_WERT
  • true.. 但是关于它需要“FOR EACH ROW”的观点仍然有效并解决了眼前的问题。
  • 错了,这种情况下他会得到ORA-04091: table TEACHING_INFORMATION is mutating, trigger/function may not see it的错误。
  • 它实际上只是在尝试运行触发器时创建此错误:SQL Error: ORA-01422: exact fetch returns more than requested number of rows ORA-06512: at "44761732.TRIGGER1", line 6 ORA-04088: error during execution of trigger '44761732.TRIGGER1' 01422. 00000 - "exact fetch returns more than requested number of rows" *Cause: The number specified in exact fetch is less than the rows returned. *Action: Rewrite the query or change number of rows requested
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
  • 2021-04-04
  • 2020-11-10
  • 2020-12-30
相关资源
最近更新 更多