1

我在 postgresql 中有一个表,我希望它被分区。结构如下

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
);

然后我创建了一些继承 Tabel "DTD1"."logAdminActivity" 的分区表,如下所示:

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");

之后,我在用户名列中为每个分区表创建索引。然后我创建这个触发函数并在下面触发调用该触发函数。因此,当我插入数据时,对应的表列将被重定向到正确的分区表中。

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' );

但是为什么它返回错误看起来像这样

错误:关系“logadminactivity_subyek”的新行违反检​​查约束“logadminactivity_subyek_check” 详细信息:失败行包含(asdf、bla、subyek、12312、2014-01-01 02:02:03)。

怎么会发生,因为我尝试遵循此文档?

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

我认为上面查询中的 'tabel' 值('subyek')与触发函数不匹配,但是当我检查时检查约束它通过。有没有我想念的部分,或者有什么解决方案可以解决这个问题?

问候

4

1 回答 1

2
CHECK ('tabel'='subyek')

该检查约束不正确,因为'tabel'它是一个常数。

它相当于CHECK (false)

你要

CHECK ("tabel"='subyek')
于 2014-06-08T18:42:08.587 回答