안녕하세요. 이제 막 오라클에 입문한 사람입니다. 제가 최근 이력을 자동으로 남겨주는 트리거를 작성하려 합니다.
일단 제가 만든 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도 만들었고요. 근데 코드에서 오류가 발생해 잘 되지 않습니다. 바인드 변수를 처음 써보는데 바인드 변수 문제인지 잘 모르겠습니다. 문제가 무엇인지 알려주시면 감사하겠습니다.
코드 붙여넣기가 잘못되어 수정하여 다시 올립니다. 답변 부탁드립니다.
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 의 사용은 문제없어 보입니다.
변수의 사용은 전혀필요없겠네요.