plpgsql 在我的 greenplum 4.3.5.x 中不起作用

Posted

技术标签:

【中文标题】plpgsql 在我的 greenplum 4.3.5.x 中不起作用【英文标题】:plpgsql didnt work in my greenplum 4.3.5.x 【发布时间】:2016-02-03 08:35:01 【问题描述】:

代码:

CREATE OR REPLACE FUNCTION dp_insert_trigger()
RETURNS trigger AS $dp_insert_trigger$
DECLARE
    tablename_1 text;
    tablename_2 text;
BEGIN
    RAISE WARNING 'Insert into process.';
    tablename_1='raw_kafka_input_dt2_1_prt_' || NEW.customer;
    tablename_2='raw_kafka_input_dt2_1_prt_' || NEW.customer || '_2_prt_' || NEW.method;

    IF not exists(select * from pg_class where  relname = tablename_1) THEN
        EXECUTE 'CREATE TABLE ' || tablename_1 || '(CHECK (customer=' || NEW.customer || ')) INHERITS (raw_kafka_input_dt2)';
        END IF;
    IF not exists(select * from pg_class where  relname = tablename_2) THEN
        EXECUTE 'CREATE TABLE ' || tablename_2 || '(CHECK (customer=' || NEW.customer || ' and method=' || NEW.method || ')) INHERITS (raw_kafka_input_dt2_1_prt_' || NEW.customer || ')';        
        END IF;
    EXECUTE 'INSERT INTO ' || tablename_2 || ' VALUES (($1).*)';
    RETURN NULL; 
END;
$dp_insert_trigger$ language plpgsql;

CREATE TRIGGER dp_insert_trigger
    BEFORE INSERT ON raw_kafka_input_dt2
    FOR EACH ROW EXECUTE PROCEDURE dp_insert_trigger();

我尝试打印一些信息,例如:

RAISE WARNING 'Insert into process.';

但是没有输出但是:

eqbase=# insert into raw_kafka_input_dt2 select * from raw_kafka_input_dt0 limit 1;
INSERT 0 1
eqbase=# 

那么,我很困惑当我插入时触发了触发器吗? 我的 pg 是 8.2 任何建议都非常感谢。

【问题讨论】:

您是否正在尝试动态创建分区?您应该查看 ALTER TABLE ... ADD PARTITION 并检查默认分区语法。 【参考方案1】:

这里有很多问题,首先是 Greenplum 不支持触​​发器。 Greenplum 是一个分析和数据仓库数据库,因此您不应该尝试使用 OLTP 功能。

【讨论】:

谢谢,官员说这是“完全符合 ACID 的事务数据库”。当我使用关键优化器时,它输出 gp 不支持此功能。但是当我使用旧版优化器时,没有像上面这样的输出但仍然没有触发触发器。这是否意味着某事? 符合 ACID 并不意味着它支持触发器。这只是意味着我可以使用具有隔离性和持久性的事务来提交和回滚数据。

以上是关于plpgsql 在我的 greenplum 4.3.5.x 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Greenplum 4.3 不支持这种“使用”语法

Greenplum 4.3:填充缺失值

如何在plpgsql中编写更新语句

在 plpgsql 函数中访问 select 语句结果

使用 plpgsql 更新函数中的列

plpgsql text[] varchar[] 数组不工作