트리거

-- 교육생이 중도 탈락하면 상담 기록 자동 삭제
CREATE OR REPLACE TRIGGER trg_delete_counsel_on_dropout
AFTER UPDATE ON tblJoinStudentManage
FOR EACH ROW
BEGIN
    IF :NEW.join_status = '중도 탈락' THEN
        DELETE FROM tblCounsel WHERE student_seq = :NEW.student_seq;
    END IF;
END;
/

잘못된 배점이 입력되지 않도록 트리거를 추가합니다.

-- 잘못된 배점인지 확인하는 트리거
CREATE OR REPLACE TRIGGER TRG_VALIDATE_SCALE
BEFORE INSERT OR UPDATE ON tblScale
FOR EACH ROW
DECLARE
    v_total NUMBER;
BEGIN
    v_total := :NEW.scale_attend + :NEW.scale_written + :NEW.scale_practice;

    IF :NEW.scale_attend < 20 THEN
        RAISE_APPLICATION_ERROR(-20004, '출결 배점은 최소 20점 이상이어야 합니다.');
    END IF;

    IF v_total <> 100 THEN
        RAISE_APPLICATION_ERROR(-20005, '출결, 필기, 실기의 합이 100점이 되어야 합니다.');
    END IF;
END;
/

-- 중도 탈락한 학생 성적 입력을 방지
CREATE OR REPLACE TRIGGER TRG_VALIDATE_SCORE
BEFORE INSERT OR UPDATE ON tblScore
FOR EACH ROW
DECLARE
    v_complete_date DATE;
BEGIN
    SELECT complete_date INTO v_complete_date
    FROM tblJoinStudentManage
    WHERE student_seq = :NEW.student_seq 
    AND course_seq = (SELECT course_seq FROM tblCourseSubjectManage WHERE subject_seq = :NEW.subject_seq);

    IF v_complete_date IS NOT NULL AND v_complete_date < SYSDATE THEN
        RAISE_APPLICATION_ERROR(-20007, '중도 탈락한 교육생의 성적을 탈락 이후에는 입력할 수 없습니다.');
    END IF;
END;
/

-- 평가점수 유효성 트리거
CREATE OR REPLACE TRIGGER TRG_VALIDATE_EVALUATION_SCORE
BEFORE INSERT OR UPDATE ON tblEvaluation
FOR EACH ROW
BEGIN
    -- 평가 점수가 1에서 5 사이인지 확인
    IF :NEW.evaluation_score < 1 OR :NEW.evaluation_score > 5 THEN
        RAISE_APPLICATION_ERROR(-20024, '평가 점수는 1에서 5 사이여야 합니다.');
    END IF;
END;
/

CREATE OR REPLACE TRIGGER TRG_DUPLICATE_COUNSEL
BEFORE INSERT ON tblCounsel
FOR EACH ROW
DECLARE
    v_count NUMBER;
BEGIN
    -- 동일한 학생이 같은 날짜에 중복 상담이 등록되지 않도록 방지
    SELECT COUNT(*)
    INTO v_count
    FROM tblCounsel
    WHERE student_seq = :NEW.student_seq
    AND counsel_date = :NEW.counsel_date;

    IF v_count > 0 THEN
        RAISE_APPLICATION_ERROR(-20011, '같은 날짜에 동일한 학생의 상담 기록이 이미 존재합니다.');
    END IF;
END;
/

CREATE OR REPLACE TRIGGER TRG_VALIDATE_EVALUATION_SCORE
BEFORE INSERT OR UPDATE ON tblEvaluation
FOR EACH ROW
BEGIN
    -- 평가 점수가 0에서 100 사이인지 확인
    IF :NEW.evaluation_score < 1 OR :NEW.evaluation_score > 5 THEN
        RAISE_APPLICATION_ERROR(-20024, '평가 점수는 0에서 100 사이여야 합니다.');
    END IF;
END;
/