안녕하세요.
어제 답글주신분 너무 감사드립니다.
저녁에 DB가 연결이 안되서 정확한 커리문을 기재하지 못했습니다.
다시 문제사항을 정리 했습니다.
-- 문제의 요점은 아래와 같습니다.
1. 먼저 test_tb를 생성합니다. -> 부모가 될 테이블 입니다.
-- drop table test_tb cascade;
CREATE TABLE test_tb
(
name character varying(10),
capture_time timestamp without time zone
)
WITH (OIDS=FALSE);
ALTER TABLE test_tb OWNER TO atms;
-- Index: idx2_capture_test_tb
-- DROP INDEX idx2_capture_test_tb;
CREATE INDEX idx2_test_tb
ON capture_test_tb
USING btree
(capture_time);
2. 자식 테이블을 상속 받아서 생성합니다.
-- child 생성
CREATE TABLE test_20081007_tb_00 (
CHECK ( capture_time >= TIMESTAMP '2008-10-07 00:00:00' AND capture_time < TIMESTAMP '2008-10-07 12:00:00' )
) INHERITS (test_tb);
CREATE TABLE test_20081007_tb_01 (
CHECK ( capture_time >= TIMESTAMP '2008-10-07 12:00:00' AND capture_time < TIMESTAMP '2008-10-08 00:00:00' )
) INHERITS (test_tb);
3. child에 테이블에 인덱스를 생성합니다.
CREATE INDEX idx_test_20081007_tb_00 ON test_20081007_tb_00 (capture_time);
CREATE INDEX idx_test_20081007_tb_01 ON test_20081007_tb_01 (capture_time);
4. 트리거 함수를 생성합니다.
CREATE OR REPLACE FUNCTION func_test_tb_today()
RETURNS TRIGGER AS $$
BEGIN
IF ( NEW.capture_time >= TIMESTAMP '2008-10-07 00:00:00' AND NEW.capture_time < TIMESTAMP '2008-10-07 12:00:00' )
THEN
INSERT INTO test_20081007_tb_00 VALUES (NEW.*);
ELSIF ( NEW.capture_time >= TIMESTAMP '2008-10-07 12:00:00' AND NEW.capture_time < TIMESTAMP '2008-10-08 00:00:00' )
THEN
INSERT INTO test_20081007_tb_01 VALUES (NEW.*);
ELSE
RAISE EXCEPTION 'Date out of range. Fix the func_test_tb_today() function!';
END IF;
RETURN NULL;
END;
$$
LANGUAGE plpgsql;
5. 트리거를 생성합니다.
CREATE TRIGGER tri_func_test_tb_today
BEFORE INSERT ON test_tb
FOR EACH ROW EXECUTE PROCEDURE func_test_tb_today();
6. 태스트 Insert구문 실행
INSERT INTO test_tb(
"name", capture_time)
VALUES ('test', '2008-10-07 12:00:00');
요기 까지는 무리 없이 진행이 됩니다. 하지만 프로젝트 진생상 내일꺼 Child테이블을 미리 만들어 놔야 합나다.
그래서 오늘 날짜에 미리 아래와 같이 내일꺼 Child 테이블을 만들었습니다.
7. 내일꺼 Child생성
CREATE TABLE test_20081008_tb_00 (
CHECK ( capture_time >= TIMESTAMP '2008-10-08 00:00:00' AND capture_time < TIMESTAMP '2008-10-08 12:00:00' )
) INHERITS (test_tb);
CREATE TABLE test_20081008_tb_01 (
CHECK ( capture_time >= TIMESTAMP '2008-10-08 12:00:00' AND capture_time < TIMESTAMP '2008-10-09 00:00:00' )
) INHERITS (test_tb);
8.내일꺼 Index 생성
CREATE INDEX idx_capture_20081008_test_tb_00 ON test_20081008_tb_00 (capture_time);
CREATE INDEX idx_capture_20081008_test_tb_01 ON test_20081008_tb_01 (capture_time);
9. 내일꺼 트리거 함수 생성
CREATE OR REPLACE FUNCTION func_test_tb_tomorrow()
RETURNS TRIGGER AS $$
BEGIN
IF ( NEW.capture_time >= TIMESTAMP '2008-10-08 00:00:00' AND NEW.capture_time < TIMESTAMP '2008-10-08 12:00:00' )
THEN
INSERT INTO capture_20081008_test_tb_00 VALUES (NEW.*);
ELSIF ( NEW.capture_time >= TIMESTAMP '2008-10-08 12:00:00' AND NEW.capture_time < TIMESTAMP '2008-10-09 00:00:00' )
THEN
INSERT INTO capture_20081008_test_tb_01 VALUES (NEW.*);
ELSE
RAISE EXCEPTION 'Date out of range. Fix the func_test_tb() unction!';
END IF;
RETURN NULL;
END;
$$
LANGUAGE plpgsql;
10. 내얼꺼 트리거 생성
CREATE TRIGGER tri_func_test_tb_tomorrow
BEFORE INSERT ON test_tb
FOR EACH ROW EXECUTE PROCEDURE func_test_tb_tomorrow();
------------------ 작업 끝..
위와같이 작업 한 후.
INSERT INTO test_tb(
"name", capture_time)
VALUES ('test', '2008-10-07 12:00:00');
위 커리문은 인서트가 잘 됩니다.
하지만 날짜를 바꿔서 insert하면..(아래)
INSERT INTO test_tb(
"name", capture_time)
VALUES ('test', '2008-10-08 12:00:00');
'Date out of range. Fix the func_test_tb_today() function!' 라는 경고메시지가 뜨고 Insert가 되지 않습니다.
트리거 함수가2개 등록되어 있는데 왜 하나만 인식할까요??
해결 방법은 있을까요?
여러 고수님들 다시 한번 좋은 답변 부탁드립니다.
그럼 수고하세요..
|