2013-10-06 3 views
0
CREATE OR REPLACE trigger million_trigger 
BEFORE INSERT or UPDATE on employee 
FOR EACH ROW 
WHEN (new.SALARY>1000000) 

DECLARE 
txt EXCEPTION; 

BEGIN 
if INSERTING or UPDATING then 

    RAISE txt ; 

end if; 

EXCEPTION 
    WHEN txt THEN 
     DBMS_OUTPUT.PUT_LINE('SALARY TOO HIGH'); 
end; 
/

안녕하세요, 직원의 급여가 1,000,000보다 큰지 확인하는 방아쇠를 만들었습니다. 급여가 더 큰 경우 트리거는 저장 프로 시저에서 삽입 문의 실행을 중지한다고 가정합니다. 트리거가 성공적으로 생성되었지만 salary> 1,000,000 인 레코드를 삽입해도 아무 일도 일어나지 않습니다. (레코드가 삽입됩니다 - 어떤 일이 일어나지 않아요) 어떤 생각?트리거가 SQl 쿼리의 실행을 중지합니다.

답변

3

트리거가 오류를 발생시키지 않도록 예외를 잡으려고합니다. 트리거가 오류를 발생시키지 않으므로 문이 계속 실행되고 궁극적으로 성공합니다. 세션에서 serveroutput을 활성화 한 경우 "Salary too high"메시지가 표시되지만 다른 사람이 읽을 수있는 버퍼 dbms_output에 쓰여진 데이터에 의존해서는 안됩니다.

INSERT 문 실행을 중지하려면 예외 처리기를 제거해야합니다. 대체로 예외를 제기하는 방법을 변경하는 것이 좋습니다.

IF(:new.salary > 1000000) 
THEN 
    RAISE_APPLICATION_ERROR(-20001, 'Salary too high'); 
END IF; 
+0

@Nidhin_toms - 작은 세상! –

관련 문제