삽입 방지 트리거
어드밴스가 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;
참고 사항:
- CREATE OR REACENT는 예비 DROP 문 없이 트리거 코드를 변경할 수 있음을 의미합니다.
- 트리거 바디와 같은 코드의 BEGIN 및 END 프레임 블록.
정적 조건은 IF ...로 프레임 구성됩니다.ENDIF 키워드; WHEN은 종료 루프 구성을 위한 것입니다.꼭 그렇지는 않습니다. 아래 업데이트 내용을 참조하십시오.- :NEW(및 :OLD) 키워드를 사용하는 참조 테이블 열 값 - 콜론을 참고합니다.
- 예외를 만들려면 RAGE_APPLICATION_ERROR를 사용합니다. 오류 번호는 Oracle이 사용자 정의 예외에 대해 예약하는 -20999 ~ -200000 범위여야 합니다.
- 오류 메시지를 의미 있게 만드십시오: 사용자에게 추측하게 하는 대신 잘못한 점을 알려주십시오.
- 들여쓰기를 사용하여 코드를 읽을 수 있도록 하는 방법을 배웁니다.당신의 미래의 동료들은 그것에 대해 감사할 것입니다.
@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
'programing' 카테고리의 다른 글
MariaDB - PHP - Form 제출 시 테이블에 데이터가 삽입되지 않음 (0) | 2023.10.02 |
---|---|
Android 회전 시 활동 다시 시작 (0) | 2023.10.02 |
스크롤 시 자동 검색 결과를 입력할 새 데이터 추가 (0) | 2023.10.02 |
인터뷰 질문 (0) | 2023.10.02 |
도커: 컨테이너가 다시 시작할 때 다시 시작됩니다. (0) | 2023.10.02 |