테이블 인서트 트리거 관련 0 2 4,114

by 손님 트리거 [2008.10.28 10:35:22]


테이블 A가 있습니다.  테이블 A에는 번호와 차수가 있습니다.

테이블 A 에 인서트시에 A테이블 레코드의 rowid를 B테이블에 적재하는 트리거를 작성하였습니다.

테이블 A에서 같은 데이터에 대해 차수만 변경이 생길시에 update가 안되고 insert가 되는구조로 되어있습니다.

결국 새로운 데이터가 들어오는거죠..  이전차수데이터 최근 차수 데이터..

B테이블에 전에(이전차수) 쌓였던 데이터의 rowid 를 지우고 지금 새로 인서트된(최근차수) 데이터의 rowid를 넣어주려면 insert trigger에서 어떻게 처리해야할까요.. 테이블 A의 PK는 x필드와, y필드의 조합입니다.

B테이블에 최근차수만 남게 하고싶습니다..

제가 작성한 트리거 구문은 다음과 같습니다. 전에 자기자신테이블이 변경시 나는 오류를 피하기위해

AFTER를 BEFORE로 변경했습니다. 그래도 오류가 나네요..

CREATE OR REPLACE TRIGGER insert_trigger BEFORE INSERT  ON "테이블 A"  FOR EACH ROW

DECLARE
v_temp_key VARCHAR2(100);
v_temp_key2 VARCHAR2(100);

BEGIN

SELECT  x, rowid INTO v_temp_key, v_temp_key2
FROM 테이블 A

WHERE x = :NEW.x;

IF(v_temp_key = :NEW.x) THEN
  delete from 테이블B where ROW_ID=v_temp_key2;

END IF;

INSERT INTO 테이블B values(:NEW.rowid);

END;

 

 

by 김강환 [2008.10.28 10:46:52]
A테이블에 신규데이타가 입력된 후 트리거를 호출하려면 AFTER INSERT가 되어야 하지 않나요? 왜 BEFORE INSERT를 하셨는지 좀 이해가 안가네요?

그리고 IF문의
delete from 테이블B where rowid=v_temp_key2;

이거 로직이 좀 않맞는것 같네요? v_temp_key2는 A테이블에 있는 로우의 ROWID인데 이걸 B 테이블의 ROWID와 비교하고 있네요? B테이블에는 분명 어떤 특정 칼럼이름으로 A테이브르이 ROWID를 담고 있지 않겠어요? 그 칼럼명이 AT_ROWID라고 했다면 아래처럼 해야 제대로 삭제가 될 것 같은데요??

delete from 테이블B where AT_ROWID=v_temp_key2;

by 질문자 [2008.10.28 11:41:47]
덧글 감사합니다. 네. AFTER INSERT가 되어야하는데요. SELECT x, rowid INTO v_temp_key, v_temp_key2
FROM 테이블 A 구문에서 AFTER로 놓고 트리거를 하면 변화하는 자기자신에 트리거를 걸수 없거든요..그래서 뭔가방법이 없나해서 물어본거구요..

IF문 예를들다보니 실수했네요. B테이블에는 A테이블의 ROWID가 맞습니다. rowid라고 만 적어서 B테이블의 rowid로 오해가 되었네요.. 질문에 오해를 일으켜 죄송합니다.~;;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입