programing

삽입 방지 트리거

yellowcard 2023. 10. 2. 13:54
반응형

삽입 방지 트리거

어드밴스가 0보다 크거나 100보다 작지 않은 경우 이 트리거를 사용하여 삽입을 방지하려면 어떻게 해야 합니까?감사해요.

DROP TRIGGER CheckAdvance;
CREATE OR REPLACE TRIGGER CheckAdvance
BEFORE INSERT OR UPDATE OF advance ON titles
FOR EACH ROW
WHEN (new.advance<0 OR new.advance>100)
BEGIN
dbms_output.put_line('Advance is Invalid.');
END;

"수업 문제였어요."

컨퍼런스에서 발표를 한 후 PL/SQL을 가르친 대학 강사와 이야기를 나누었습니다.제 강연은 PL/SQL 우수 사례에 관한 것이었습니다. 슬라이드 중 하나는 "트리거를 사용하지 마십시오"라고 간단히 말했습니다.강사는 그런 조언은 교육과정의 요구와 조화되기 어렵다고 제게 말했습니다.그들은 학생들에게 모든 구문을 가르쳐야 하지만 그는 종종 소프트웨어를 전문적으로 작성할 때 사용하지 않을 해결책을 요구하는 과제를 설정한다는 것을 인정했습니다.

이런 질문입니다.고든의 대답이 보여주듯이, 체크 제약을 사용하는 것이 올바른 접근법입니다.제약이 더 효율적이고 관용적입니다.하지만 선생님께서 트리거를 쓰길 원하셔서, 여기 코드가 수정되었습니다.

CREATE OR REPLACE TRIGGER CheckAdvance
    BEFORE INSERT OR UPDATE OF advance ON titles
    FOR EACH ROW
BEGIN
    IF :new.advance < 0 
    THEN
        raise_application_error(-20000
                , 'Advance cannot be less than zero');
    ELSIF :new.advance > 100
    THEN
        raise_application_error(-20001
                , 'Advance cannot be greater than one hundred.');
    END IF;
END;

참고 사항:

  1. CREATE OR REACENT는 예비 DROP 문 없이 트리거 코드를 변경할 수 있음을 의미합니다.
  2. 트리거 바디와 같은 코드의 BEGIN 및 END 프레임 블록.
  3. 정적 조건은 IF ...로 프레임 구성됩니다. ENDIF 키워드; WHEN은 종료 루프 구성을 위한 것입니다.꼭 그렇지는 않습니다. 아래 업데이트 내용을 참조하십시오.
  4. :NEW(및 :OLD) 키워드를 사용하는 참조 테이블 열 값 - 콜론을 참고합니다.
  5. 예외를 만들려면 RAGE_APPLICATION_ERROR를 사용합니다. 오류 번호는 Oracle이 사용자 정의 예외에 대해 예약하는 -20999 ~ -200000 범위여야 합니다.
  6. 오류 메시지를 의미 있게 만드십시오: 사용자에게 추측하게 하는 대신 잘못한 점을 알려주십시오.
  7. 들여쓰기를 사용하여 코드를 읽을 수 있도록 하는 방법을 배웁니다.당신의 미래의 동료들은 그것에 대해 감사할 것입니다.

@yadipp는 Seeker의 질문에 사용된 WHEN 조항이 유효한 구문이라는 것을 상기시켜 주었기 때문에 뒤늦게 어떻게 보일지 보여주기 위해 솔루션을 확장하고 있습니다.가장 중요한 점은 NEW와 OLD는 바인딩 변수로 취급되지 않으므로 주의하지 마십시오.:.

CREATE OR REPLACE TRIGGER CheckAdvance
    BEFORE INSERT OR UPDATE OF advance ON titles
    FOR EACH ROW
    WHEN (new.advance < 0 OR new.advance > 100)
BEGIN
    raise_application_error(-20000
                , 'Advance cannot be less than zero or greater than one hundred.');
END;

(그리고 트리거 바디에서 IF를 사용하는 한 가지 이유를 보여주기 위해 원래 솔루션을 수정했습니다. 다른 조건을 다르게 처리하는 것입니다.)

이거는 방아쇠로 하면 안 돼요.Oracle(및 일반적으로 SQL)은 다음과 같은 체크 제약 조건을 지원합니다.

alter table titles
    add constraint chk_titles_advance check (advance > 0 and advance <= 100);

언급URL : https://stackoverflow.com/questions/41092940/prevent-insert-trigger

반응형