안녕하세요. 오랜만에 글을 올리네요.
트리거와 관련해서 질문을 드리겠습니다.
-- 부품 테이블입니다.
CREATE TABLE part
(
partno character(12) NOT NULL,
partname character varying(50) NOT NULL,
...(생략)
CONSTRAINT part_pkey PRIMARY KEY (partno)
);
-- 부품 초기재고 테이블입니다.
CREATE TABLE initstock
(
partno character(12) NOT NULL,
qty integer NOT NULL,
registered timestamp with time zone NOT NULL DEFAULT now(),
...(생략)
CONSTRAINT initstock_partno_fkey FOREIGN KEY (partno)
REFERENCES part (partno) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE NO ACTION
);
-- 재고 테이블입니다.
CREATE TABLE stock
(
partno character(12) NOT NULL,
qty integer NOT NULL DEFAULT 0,
CONSTRAINT stock_pkey PRIMARY KEY (partno),
CONSTRAINT stock_partno_fkey FOREIGN KEY (partno)
REFERENCES part (partno) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE
);
-- 초기재고 갱신 트리거는 아래와 같습니다.
CREATE OR REPLACE FUNCTION initstock_upd()
RETURNS trigger AS
$BODY$
begin
if old.partno = new.partno then
update stock set qty = qty + (new.qty - old.qty) where partno = new.partno;
else
update stock set qty = qty - old.qty where partno = old.partno;
update stock set qty = qty + new.qty where partno = new.partno;
end if;
return null;
end;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
CREATE TRIGGER initstock_upd_trig
AFTER UPDATE
ON initstock
FOR EACH ROW
EXECUTE PROCEDURE initstock_upd();
--------------------
초기재고를 추가와 삭제시 재고 테이블의 재고수량이 갱신은 정확히 됩니다.
초기재고의 값을 변경해도 반영이 잘 되고요.
문제는 부품(part) 테이블의 partno(PK)가 변경이 될 경우 초기재고(initstock) 테이블과 재고(stock)테이블이 partno를 외래키로 참조하는데
초기재고의 갱신 트리거 함수가 작동되면서 재고가 초기재고 수량의 2배로 증가한다는 겁니다.
이걸 해결할 방법은 어떤게 있습니까?
제가 떠오르는 방법은 아래와 같은데... 더 좋은 방법이나 구체적인 방법 좀 조언 부탁합니다.
1. 트리거 함수를 제거하고 응용프로그램에서 처리한다.
2. 트리거 함수에서 처리하는 방법(이게 가능한지 모르겠습니다)
3. 외래키 처리방식을 변경한다.(변경이 안되는 다른 키를 추가해서 참조한다)
감사합니다.
|