[error] ORA-02291: integrity constraint () violated - parent key not found

sung eon·2023년 2월 20일
0

에러메시지
ORA-02291: integrity constraint () violated - parent key not found
ORA-06512: at "", line 6
ORA-04088: error during execution of trigger ''

| 상황

  • 회원가입시 자동으로(동시에) 포인트 2000쿠폰 증정되는 트리거를 만들어놨었다.
    • 포인트 디테일 테이블에는 회원가입-포인트 금액이 들어간다.
    • 포인트 테이블에는 아이디와 포인트 총 합계 금액이 들어간다.
CREATE TRIGGER register_user AFTER INSERT ON users
FOR EACH ROW
BEGIN
    insert into point
    (user_id, total_point)
    VALUES
    (:NEW.id , 2000);
    insert into coupon
    (num,user_id,sort,percentage,created_date,used_date,status)
    values
    (seq_coupon.nextval, :new.id,0,5,sysdate,'',0);
    insert into point_detail
    (created_date, user_id, sort, amount)
    values
    (:new.created_date, :new.id, 0, 2000);
END;

여기서 포인트 디테일이 Insert되면 포인트 테이블에 해당 유저의 포인트 합계 컬럼이 update되는 트리거를 따로 만들었다.

왜냐하면 포인트 디테일에 컬럼이 추가되는 경우가 회원가입말고도 구매, 등급업 등등이 있었으므로...

그래서 트리거를 통해 이중으로 insert되는것을 막기위해 point insert 구문을 빼버리고, 실행해봤다.

-- ----------- 회원가입시 포인트디테일 + 쿠폰
CREATE TRIGGER register_user AFTER INSERT ON users
FOR EACH ROW
BEGIN
    insert into point
    (user_id, total_point)
    VALUES
    (:NEW.id , 2000);
    insert into coupon
    (num,user_id,sort,percentage,created_date,used_date,status)
    values
    (seq_coupon.nextval, :new.id,0,5,sysdate,'',0);
    insert into point_detail
    (created_date, user_id, sort, amount)
    values
    (:new.created_date, :new.id, 0, 2000);
END;

-- ---------- 포인트 디테일 추가시 토탈 포인트 업데이트
CREATE OR REPLACE TRIGGER point_trigger AFTER INSERT ON point_detail 
FOR EACH ROW
BEGIN
   update point set total_point = :new.amount + total_point
   where user_id = :new.user_id;
END;

해당 에러를 만났다.

에러메시지도 읽어보고 곰곰이 생각해보니, 포인트 테이블의 ID 컬럼을 참조하고 있는 포인트 상세 테이블에 컬럼이 insert되려면 포인트 테이블에도 해당 컬럼이 있어야하는데 컬럼이 없어서 무결성에 위배되는 것이었다.

따라서

-- ----------- 회원가입시 포인트디테일 + 쿠폰
CREATE TRIGGER register_user AFTER INSERT ON users
FOR EACH ROW
BEGIN
    insert into point
    (user_id, total_point)
    VALUES
    (:NEW.id , 0); -- 포인트 총합을 초기값(0)을 넣어서 컬럼을 만들어주고
    insert into coupon
    (num,user_id,sort,percentage,created_date,used_date,status)
    values
    (seq_coupon.nextval, :new.id,0,5,sysdate,'',0);
    insert into point_detail
    (created_date, user_id, sort, amount)
    values
    (:new.created_date, :new.id, 0, 2000);
END;

-- ---------- 포인트 디테일 추가시 토탈 포인트 업데이트
CREATE OR REPLACE TRIGGER point_trigger AFTER INSERT ON point_detail 
FOR EACH ROW
BEGIN
   update point set total_point = :new.amount + total_point
   where user_id = :new.user_id;
END;

포인트 디테일 추가시 토탈 포인트 업데이트 되는 트리거를 그대로 만들어서 실행해준다.

  • 테스트 코드로 회원가입 해주면
    • 회원가입 잘 됨
    • 포인트 테이블에 초기값으로 셋팅된 컬럼 생성 잘 됨
      • 처음에는 회원가입 프로시저만 생성해서 이런식으로 확인됐다.

만약, point 프로시저까지 같이 만들어서 실행하면

  • 성공
  • 회원가입 잘 됨
  • 포인트 디테일에도 잘 들어감
  • 포인트 0값에서 포인트 디테일에 들어간 값 2000이 추가되어 잘 들어감
profile
코베베

0개의 댓글