簡體   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