이런일이 있을 수 있을까요 0 2 1,449

by 이동성 [2008.10.16 23:35:17]


테이블 A,B가 있습니다.

A는 ID, POINT

B에 ID, POINT_BEFORE, POINT_ADJUST, POINT_AFTER

 

프로시저가 있습니다. 대충 아래와 같습니다.

PROCEDURE(

  v_ID VARCHAR2,

  v_POINT_ADJUST NUMBER

)

IS

  v_POINT_BEFORE NUMBER;

BEGIN

-- 입력한 ID의 현재 포인트 값을 가져옴

  SELECT POINT

  INTO v_POINT_BEFORE

  FROM A

  WHERE ID = v_ID;

-- 현재 포인트가 수정요청한 포인트 보다 작으면 프로시저 끝

  IF v_POINT_BEFORE < v_POINT_ADJUST THEN

    RETURN;

  END IF;

-- v_POINT_BEFORE >= v_POINT_ADJUST 라면

-- 수정요청한 금액을 뺀 금액이 POINT_AFTER 가 됨

  INSERT INTO B(ID, POINT_BEFORE, POINT_ADJUST, POINT_AFTER)

  VALUES(v_ID, v_POINT_BEFORE, v_POINT_ADJUST, v_POINT_BEFORE - v_POINT_ADJUST);

END;

 

 

어느날 보니, B 테이블에

[ID, POINT_BEFORE, POINT_ADJUST, POINT_AFTER]

A, 20000, 60000, -40000

 

이런 행이 있습니다.

프로시저에서 20000 < 60000 이기때문에 INSERT문을 실행할 수 가 없고,

외부에서는 저 프로시저를 통하지않고서는 B테이블에 접근 할 수 없고,

내부의 어떤사람도 B테이블을 직접적으로 손댄적이 없는데.....

저게 어떻하면 가능할까요?

by 김강환 [2008.10.17 09:03:15]
글세...로직상으로는 문제가 없어 보이는데....
B 테이블에 누가,언제 입력했는지에 대한 칼럼이 없나요? 먼저 그거 살펴서 해당 데이타가 입력된 경로를 한번 따져보시구요.
앞으로 이런 일을 방지하기 위해서 POINT_AFTER 칼럼에 >=0 이라는 체크조건을 걸어두시는게 좋을 듯 싶습니다.
v_POINT_BEFORE >=v_POINT_ADJUST 일 경우 v_POINT_BEFORE - v_POINT_ADJUST 값을 POINT_AFTER 칼럼에 입력하기 때문에...

by 이동성 [2008.10.17 21:59:53]
긴글 읽어주시고 답변 달아주셔서 감사합니다 ^^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입