0

나는 postgresql에 테이블을 가지고 있고 그것을 분할하고 싶습니다. 나는 인덱스 각 파티션 테이블을 만들고 그 후분할 된 테이블에 삽입 반환 제약 조건을 위반하지만

CREATE TABLE "DTD1".logAdminActivity_kategori ( 
    CHECK ('tabel'='kategori') 
) INHERITS ("DTD1"."logAdminActivity"); 

CREATE TABLE "DTD1".logAdminActivity_subyek (
    CHECK ('tabel'='subyek') 
) INHERITS ("DTD1"."logAdminActivity"); 

... 

CREATE TABLE "DTD1".logAdminActivity_satuan (
    CHECK ('tabel'='satuan') 
) INHERITS ("DTD1"."logAdminActivity"); 

CREATE TABLE "DTD1".logAdminActivity_memberfilter (
    CHECK ('tabel'='memberFilter') 
) INHERITS ("DTD1"."logAdminActivity"); 

을 :. 구조는 다음

TABLE "DTD1"."logAdminActivity" ( 
    "username" CHARACTER VARYING(200) NOT NULL, 
    "action" CHARACTER VARYING(100) NOT NULL, 
    "pk" CHARACTER VARYING(5) NOT NULL, 
    "tabel" CHARACTER VARYING(200)NOT NULL, 
    "timestamp" TIMESTAMP WITHOUT TIME ZONE 
); 

I는 다음과 같이 위의 "logAdminActivity을"Tabel "DTD1을"상속 일부 파티션 테이블을 생성했습니다 이하 username coloumn. 그런 다음이 트리거 함수를 만들고 그 함수를 아래에서 트리거합니다. 따라서 데이터를 삽입하면 해당 테이블 coloumn이 적절한 파티션 테이블로 리디렉션됩니다. 그런 다음

CREATE OR REPLACE FUNCTION "DTD1".logAdminActivity_insert_trigger() 
RETURNS TRIGGER AS $$ 
BEGIN 
    IF (New."tabel" = 'kategori') THEN 
     INSERT INTO "DTD1".logAdminActivity_kategori VALUES (NEW.*); 
    ELSIF (New."tabel" = 'subyek') THEN 
     INSERT INTO "DTD1".logAdminActivity_subyek VALUES (NEW.*); 
    ..  
    ELSE 
     RAISE EXCEPTION 'Tabel out of range. Fix the logAdminActivity_insert_trigger() function!' ; 
    END IF; 
    RETURN NULL; 
END; 
$$ 
LANGUAGE plpgsql; 

CREATE TRIGGER insert_logAdminActivity_trigger 
    BEFORE INSERT ON "DTD1"."logAdminActivity" 
    FOR EACH ROW EXECUTE PROCEDURE "DTD1".logAdminActivity_insert_trigger(); 

나는 삽입 절차에 의해 테스트 등

INSERT INTO "DTD1"."logadminactivity_subyek" ("action", "pk", "tabel", "timestamp", "username") 
VALUES ('bla', '12312', 'subyek', '2014-01-01 02:02:03', 'asdf'); 

하지만 내가 따라하려고했기 때문에이 발생 할 수있는 방법이

ERROR: new row for relation "logadminactivity_subyek" violates check constraint "logadminactivity_subyek_check" DETAIL: Failing row contains (asdf, bla, subyek, 12312, 2014-01-01 02:02:03).

같은 오류 모습을 반환하는 이유 이것의 문서?

http://www.postgresql.org/docs/9.3/static/ddl-partitioning.html

나는 트리거 기능과 일치하지 않습니다 위의 질의에서 'tabel'값 ('subyek')를 생각하지만 난 수표 확인 때 통과 제한. 내가 놓친 부분이 있습니까? 아니면이 문제를 해결할 수있는 해결책이 있습니까? 'tabel'가 일정하기 때문에 제약이 잘못 확인

감사

답변

2
CHECK ('tabel'='subyek') 

.

이것은 CHECK (false)과 동일합니다.

당신은

CHECK ("tabel"='subyek') 
+0

아를 원하는, 그것은 일정한 감사가 될 tabel 수 있도록합니다. 그리고 그것은 작동하지만 데이터가 마스터 테이블에 저장되어 있다면 사실입니까? –

+0

트리거가'RETURN NULL '로 끝나기 때문에 마스터 테이블에 삽입 할 수 없습니다. 나는 네가 의미하는 바를 얻지 못할까 봐 걱정한다. –

+0

일부 대소 문자를 삽입 할 때 이미 적절한 파티션 테이블에 존재하는 일부 데이터가 마스터 테이블에 있습니다 (테이블 마스터와 하위 테이블간에 중복 됨). 방아쇠 활동에 문제가 있습니까? –

관련 문제