Обновление триггера с отложенными ограничениями, работающими, но с ошибкой при фиксации - PullRequest
0 голосов
/ 13 апреля 2019

У меня есть таблица курсов и таблица оценок.Информация о курсе первичного ключа является внешним ключом в таблице оценок.В курсе есть один ключевой столбец, который можно обновить, а затем обновить в таблице оценок.

Используя отложенные внешние ключи, я создал триггер, который работает и обновляет этот курс и результаты.

Проблема возникает, когда я хочу зафиксировать обновленное ограничение целостности данных (GRADE_fk), нарушено - найдена дочерняя запись. Это означает, что курс, который я хочу обновить, имеет оценки, но с этим должно справиться отложенное ограничение.

После запуска триггера все данные верны, и нет оценок без курса.

Это триггер-

 CREATE OR REPLACE TRIGGER CRSE_UPDATE_TRG 
 INSTEAD OF UPDATE ON COURSE_TBL
 FOR EACH ROW
 DECLARE
 DUPLICATE_INFO EXCEPTION;

PRAGMA EXCEPTION_INIT (DUPLICATE_INFO, -00001);

BEGIN  
EXECUTE IMMEDIATE ('set constraint GRADE_FK deferred');
/*
UPDATING  PHASE FOR ALL CLASS_SECTIONS
*/
  UPDATE COURSE_TBL SET
    CRSE_PHASE = :NEW.CRSE_PHASE
  WHERE (CRSE_ID = :OLD.CRSE_ID)
  AND ( :NEW.CRSE_PHASE='1' OR :NEW.CRSE_PHASE='2' )

  ;



/*
UPDATES GRADE RECORDS WITH UPDATED PHASE FROM COURSE, WHERE THE NEW PHASE IN CRSE ISN'T '1 & 2' OR "NULL"
*/
  UPDATE GRADE_TBL SET
  PHASE =
  :NEW.CRSE_PHASE
    WHERE
    (
    CRSE_ID = :OLD.CRSE_ID AND
    STRM = :OLD.STRM AND
    CLASS_NBR= :OLD.CLASS_NBR 
    AND (:NEW.CRSE_PHASE='1' OR :NEW.CRSE_PHASE='2' )
    AND :NEW.CRSE_PHASE IS NOT NULL
    );

 END  CRSE_UPDATE_TRG;

У кого-нибудь есть обходные пути, такие как каскадное обновление, которые работают в Oracle 12C?

Спасибо!

...