이력 트리거 관련 질문 0 2 945

by TOOAI [PL/SQL] 트리러 [2018.09.23 13:56:05]


안녕하세요. 이제 막 오라클에 입문한 사람입니다. 제가 최근 이력을 자동으로 남겨주는 트리거를 작성하려 합니다.

일단 제가 만든 Book 테이블이 있습니다.

book_id(책 번호같은 것입니다.),book_title(제목),book_write(저자),book_publ(출판사)이루어져 있습니다.

id는 number형 나머지는 varchar2형이며, id는 기본키로 되어 있습니다.

아래는 제가 만든 트리거 코드입니다.

CREATE OR REPLACE TRIGGER BOHISTORY
BEFORE
INSERT OR UPDATE OR DELETE ON BOOK
FOR EACH ROW
DECLARE
H_GUBUN VARCHAR2(20);
H_ILJA DATE;
H_BOID NUMBER(10);
H_BOTIT VARCHAR2(50);
H_BOWRI VARCHAR2(30);
H_BOPUB VARCHAR2(30);

BEGIN
IF INSERTING THEN
INSERT INTO BOOK_HIS(H_GUBUN,H_ILJA,H_BOID,H_BOTIT,H_BOWRI,H_BOPUB)
VALUES('INSERT',SYSDATE,:NEW.BOOK_ID,:NEW.BOOK_TITLE,:NEW.BOOK_WRITE,:NEW.BOOK_PUBL
);

ELSIF UPDATING THEN
INSERT INTO BOOK_HIS(H_GUBUN,H_ILJA,H_BOID,H_BOTIT,H_BOWRI,H_BOPUB) 
VALUES('UPDATE',SYSDATE,:OLD.BOOK_ID,:OLD.BOOK_TITLE,:OLD.BOOK_WRITE,:OLD.BOOK_PUBL
);

ELSIF DELETING THEN
INSERT INTO BOOK_HIS(H_GUBUN,H_ILJA,H_BOID,H_BOTIT,H_BOWRI,H_BOPUB)
VALUES('DELETE',SYSDATE,:OLD.BOOK_ID,:OLD.BOOK_TITLE,:OLD.BOOK_WRITE,:OLD.BOOK_PUBL);
END IF;

END;

insert,update,delete될 때 발동되는 트리거이며, 구분에는 inser인지 update인지 구분해주는 키워드,날짜에는 sysdate를 넣었습니다.

insert일 때는 새로 들어온 new 값이, update나 delete이면 수정(삭제)되기 전 old값을 저장해주는 트리거입니다. 이력관리 테이블인 book_his도 만들었고요. 근데 코드에서 오류가 발생해 잘 되지 않습니다. 바인드 변수를 처음 써보는데 바인드 변수 문제인지 잘 모르겠습니다. 문제가 무엇인지 알려주시면 감사하겠습니다.

코드 붙여넣기가 잘못되어 수정하여 다시 올립니다. 답변 부탁드립니다.

by 야신 [2018.09.23 18:02:57]

INSERT INTO BOOK_HIS(H_GUBUN,H_ILJA,H_BOID,H_BOTIT,H_BOWRI,H_BOPUB) 에서

변수가 아니라 컬럼명을 써야 합니다. 예를 들면 아래처럼

INSERT INTO BOOK_HIS(gubun,update_date, book_id,book_title,book_write,book_publ)

VALUES('INSERT',SYSDATE,:NEW.BOOK_ID,:NEW.BOOK_TITLE,:NEW.BOOK_WRITE,:NEW.BOOK_PUBL

);

:NEW 나 :OLD 의 사용은 문제없어 보입니다.

변수의 사용은 전혀필요없겠네요.


by TOOAI [2018.09.23 19:17:22]

그렇군요. 제가 지금 당장 코드가 잘 되는지 확인은 못하지만 말씀 감사합니다. 또 배워가네요.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입