가 나타납니다 : 여기
마스터에서 여분의 행을 삭제하는 트리거 후와 예입니다 WHERE 문이없는 단일 RULE.
ref2
ref3
또 다른 옵션은 '랩'파티션 테이블, 당신은 성공적인 행 업데이트를 표시하기 위해 새 행을 반환하는 뷰를 만들 수 있습니다
ref1
없이 실수로 여분의 원치 않는 행을 마스터 테이블에 추가합니다.
create view tablename_view as select * from tablename; -- create trivial wrapping view
CREATE OR REPLACE FUNCTION partitioned_insert_trigger() -- partitioned insert trigger
RETURNS TRIGGER AS $$
BEGIN
IF (NEW.partition_key>= 5500000000 AND
NEW.partition_key < 6000000000) THEN
INSERT INTO tablename_55_59 VALUES (NEW.*);
ELSIF (NEW.partition_key >= 5000000000 AND
NEW.partition_key < 5500000000) THEN
INSERT INTO tablename_50_54 VALUES (NEW.*);
ELSIF (NEW.partition_key >= 500000000 AND
NEW.partition_key < 1000000000) THEN
INSERT INTO tablename_5_9 VALUES (NEW.*);
ELSIF (NEW.partition_key >= 0 AND
NEW.partition_key < 500000000) THEN
INSERT INTO tablename_0_4 VALUES (NEW.*);
ELSE
RAISE EXCEPTION 'partition key is out of range. Fix the trigger function';
END IF;
RETURN NEW; -- RETURN NEW in this case, typically you'd return NULL from this trigger, but for views we return NEW
END;
$$
LANGUAGE plpgsql;
CREATE TRIGGER insert_view_trigger
INSTEAD OF INSERT ON tablename_view
FOR EACH ROW EXECUTE PROCEDURE partitioned_insert_trigger(); -- create "INSTEAD OF" trigger
심판 : http://www.postgresql.org/docs/9.2/static/trigger-definition.html
당신은 하나의 옵션은 또한뿐만 아니라, 삭제 및 업데이트 트리거 "대신"사소한 정의하는 뷰 래퍼 길을 갔다면, 당신은 단지의 이름을 사용할 수 있습니다 모든 거래에서 정상 테이블 대신보기 테이블을 사용하십시오.
보기를 사용하는 또 다른 옵션은 기본 테이블의 모든 삽입이 [해당 트리거를 사용하는]보기 (예 : partitioned_insert_trigger
및 tablename_view 및 insert_view_trigger가 위에 나열된대로 있다고 가정 할 때)로 이동하는 삽입 규칙을 만드는 것입니다)
create RULE use_right_inserter_tablename AS
ON INSERT TO tablename
DO INSTEAD insert into tablename_view VALUES (NEW.*);
그런 다음 새로운 작업보기 래퍼 삽입을 사용합니다.
다른 모든 솔루션은 최대 절전 모드 3.5? –