2013-03-25 1 views
1

빈 행을 테이블 행에 삽입하지 못하도록 PL/SQL에 트리거를 삽입하기 전에 을 생성하려고합니다. (트리거는 null이 아닌 조건을 적용하고 삽입 숫자 나 특수 문자를 방지합니다.pl-sql에서 트리거를 사용하여 테이블 행에 빈 데이터를 삽입하는 것을 방지하는 방법

이 내가 만든 테이블입니다.

CREATE TABLE CUSTOMER 
(
    CUSTOMER_ID INTEGER 
, CUST_FORENAME VARCHAR2(50) NOT NULL 
, CUST_SURNAME VARCHAR2(50) NOT NULL 
, GENDER CHAR(1) 
, EMAIL_ADDRESS VARCHAR2(30) NOT NULL 
, CONSTRAINT CUSTOMER_PK PRIMARY KEY (CUSTOMER_ID) 
    ENABLE 
); 

내가 만든 트리거.

create or replace 
TRIGGER CUS_MAND before insert OR update on CUSTOMER 
begin 
    CASE 
    WHEN :NEW.CUST_FORENAME = NULL 
     THEN DBMS_OUTPUT.PUT_LINE ('Please enter customer forename.'); 
    WHEN :NEW.CUST_SURNAME = NULL 
     THEN DBMS_OUTPUT.PUT_LINE ('Please enter customer surname.'); 
    WHEN :NEW.EMAIL_ADDRESS = NULL 
     THEN DBMS_OUTPUT.PUT_LINE ('Please enter customer email address.'); 
    END CASE; 
END; 

그러나이 트리거가 성공적으로 작동하지 않습니다. 누군가가 나를 위해 문제를 해결할 수 있습니까?

+6

이것은 트리거에 대한 wriong 사용입니다.NOT NULL 제약 조건을 사용하여 NOT NULL을 적용하고 원하는 경우 클라이언트 측 유효성 검사를 사용합니다. – APC

+0

또한 질문은 "이 트리거가 성공적으로 작동하지 않는 방식"을 설명해야합니다. – APC

+0

클라이언트 측 유효성 검사는 정보를 데이터베이스로 보내기 전에 모든 필수 필드가 완료된 경우 응용 프로그램의 클라이언트 부분을 검사하는 것을 의미합니다. –

답변

4

@APC 지적한 바와 같이 NOT NULL 제약 조건을 사용하는 것이 더 합리적입니다. 이 목적을위한 트리거. 당신이 트리거를 사용하려면

그러나, 당신은 단지 메시지를 인쇄하는

  • 일반적으로 잘못된 데이터의 삽입을 방지 할 수 없습니다

    • 때문에 DBMS_OUTPUT을 인쇄하는 대신 오류가 발생한다, 인서트/업데이트가 클라이언트 프로그램의 일종에 의해 운영되며, DBMS_OUTPUT이 클라이언트 프로그램 외에도에서

    에 표시되지 않습니다, 당신은 당신의 트리거에 오류가 몇있어 :

    는 달리, 각 행의로 방아쇠를 선언 할 필요가
    • , 당신은 사용할 수 없습니다 : NEW 및 : OLD (트리거가 에 한 번 발사되기 때문에, 한번도 당 행)
    • CASE 문에 DEFAULT 분기가 없으므로 모든 검사가 성공적이면 실행 중에 오류가 발생합니다. I는 IF를 사용하는 것 대신

    하나의 가능한 해결 방법 : 여기

    create or replace trigger CUS_MAND before insert OR update on CUSTOMER 
    for each row   
    begin 
        if :NEW.CUST_FORENAME is NULL THEN 
        RAISE_APPLICATION_ERROR(-20001, 
              'Please enter customer forename.'); 
        end if; 
        if :NEW.CUST_SURNAME is NULL THEN 
        RAISE_APPLICATION_ERROR(-20002, 
              'Please enter customer surname.'); 
        end if; 
        if :NEW.EMAIL_ADDRESS is NULL THEN 
        RAISE_APPLICATION_ERROR(-20003, 
              'Please enter customer email address.'); 
        END if; 
    END; 
    

    , I는 RAISE_APPLICATION_ERROR 사용자 정의 예외를 발생하는 데 사용; 모든 오류에 대해 동일한 오류 번호 (-20001)를 사용하거나 숫자를 사용하여 오류를 구별 할 수 있습니다. 당신은 널 (null)을 검사하는

  • 0

    는 길을 잘못 값 :

    :NEW.CUST_FORENAME = NULL 
    

    NULL 값 검사는 "null 인"또는 "null가 아닌"사용해야합니다. 같음 연산자가 작동하지 않습니다. NULL과 동등하거나 다른 것은 없습니다. = 널 (null) : 경우

    그래서,

    a = Null => false 
    a != null => false 
    a is null => true 
    a is not null => false 
    

    는 또한, 트리거는 "각 행에 대해"해야 프랭크 슈미트에 의해 지적.

    유효성 검사가 간단하면 null이 아닌 제약 조건이나 검사 제약 조건을 사용하는 것이 가장 좋은 방법 일 수 있습니다.

    +1

    트리거에 아무런 의미가 없습니다 ... OPs 상황에서 null이 아니거나 제약 조건을 사용할 수 있습니다 ... – Ben

    +0

    수 없습니다. 그러나 당신은 체크 제약으로 할 수 있습니다. – Ben

    +0

    @Ben이 말했듯이이 질문에서 NULL 검사에 트리거를 사용하는 것은 의미가 없습니다. 좀 더 복잡한 수표를 만들어야하는 상황을 여러 가지 방법으로 처리 할 수 ​​있지만, 우리가 그 길을 떠나기 시작하면 (OP가 묻지 않은 질문에 답하는) 우리는 곧 데이터베이스 인 - 데이터베이스를 구현하고 Cthulhu가 우리에게 자비를 베풀어 줄 수 있습니다. (비록 Cthulhu가 광기의 어두운 전망에서 나에게 말했듯이, 그는 케찹을 자비로 선호한다.). 공유하고 즐기십시오. –