2016-12-12 1 views
0

사전 트리거가 0보다 크지 않거나 100보다 작 으면 삽입을 방지하기 위해이 트리거를 어떻게 얻을 수 있습니까? 감사.삽입 트리거 방지

+0

트리거는 삽입이 실제로 발생했다는 사실을 변경할 수 없습니다. 그렇게하기 위해서 삽입 쿼리에 건강한'WHERE' 절을 사용하면 어떨까요? –

+2

이것이 디자인 질문이라면, 위의 Tim의 코멘트와 @ GordonLinoff의 답변은 모두 우수합니다. 그러나 이것이 수업 과제 인 경우 (수업 과제는 종종 학생들에게 수업을 가르치는 사람들이 나쁜 점을 알기 위해 충분한 시간을 보지 못했기 때문에 학생들에게 일을해서는 안되는 일을하도록 요청합니다), 예외를 제기 할 수 있습니다. 트리거, 당신의 코드 본문에 그것을 잡아, 'ROLLBACK' 트랜잭션, 따라서 삽입을 방지합니다. 이것은 빈약 한 관행임을 유의하십시오. –

+0

@BobJarvis 네, 그것은 계급 문제였습니다. RAISE_APPLICATION_ERROR와 관련이있을 것 같습니다. – Annihil8

답변

3

저는 컨퍼런스에서 프리젠 테이션을 한 후 PL/SQL을 가르친 대학 강사와 이야기를 나누었습니다. 저의 연설은 PL/SQL 우수 사례였습니다. 내 슬라이드 중 하나는 단순히 "트리거 사용 안 함"이라고 말했습니다. 강사는 커리큘럼의 필요와 조화시키기가 어려울 때 조언을 듣는다 고 말했습니다. 학생들에게 모든 구문을 가르쳐야하지만 그는 종종 소프트웨어를 전문적으로 작성할 때 사용하지 않을 솔루션을 요구하는 작업을 설정한다고 인정했습니다.

이것은 이와 같은 질문입니다. 올바른 접근 방식은 점검 제한 조건을 사용하는 것입니다 (Gordon's answer shows). 제약 조건은보다 효율적이고 관용적입니다. 그러나 선생님은 방아쇠를 쓰길 원하기 때문에 코드가 수정되었습니다.

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

참고할 사항 :

  1. CREATE OR 우리는 예비 DROP 문하지 않고 트리거 코드를 변경할 수 있습니다 수단을 대체합니다.
  2. BEGIN 및 END 프레임은 트리거 본문과 같은 코드 블록입니다.
  3. 정적 조건은 IF ... END IF 키워드로 프레임됩니다. WHEN은 루프 생성을 종료하기위한 것입니다.
  4. 참조 표의 열 값은 다음과 같습니다. NEW (및 : OLD) 키워드 - 콜론을 유의하십시오.
  5. RAISE_APPLICATION_ERROR를 사용하여 예외를 throw합니다. 오라클이 사용자 정의 예외에 대해 예약하는 -20999 ~ -20000 범위의 오류 번호 여야합니다.
  6. 오류 메시지를 의미있게 만드십시오 : 사용자가 추측하지 말고 잘못했는지 알려줍니다.
  7. 들여 쓰기를 사용하여 코드를 읽을 수있게 만드는 방법을 배웁니다. 당신의 미래 동료는 당신에게 감사 할 것입니다.
4

트리거를 사용해서는 안됩니다. 오라클 (그리고 일반적으로 SQL)를 점검 제한 조건을 지원합니다 ".이 클래스 질문이었다"

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