У меня есть таблица курсов и таблица оценок.Информация о курсе первичного ключа является внешним ключом в таблице оценок.В курсе есть один ключевой столбец, который можно обновить, а затем обновить в таблице оценок.
Используя отложенные внешние ключи, я создал триггер, который работает и обновляет этот курс и результаты.
Проблема возникает, когда я хочу зафиксировать обновленное ограничение целостности данных (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?
Спасибо!