在 Greenplum 中使用触发器时出错

Posted

技术标签:

【中文标题】在 Greenplum 中使用触发器时出错【英文标题】:Error while using Trigger in Greenplum 【发布时间】:2014-12-17 13:44:39 【问题描述】:

如果你们中的任何人在 Greenplum 上创建/尝试过触发器,请帮我解决这个问题

我有一个表,其中“id”列有一些值,我想放置一个触发器 在此表中插入任何数据之前,应调用函数/触发器进行检查 a) 数据是否可用于父表中的“id” b)给定的“id”已经有一行可用

--表DDL

create table test_trigger(id integer, details text);

--触发函数

create or replace function insert_row_trigger() returns trigger as $$
begin
if exists (SELECT 1 FROM test_trigger WHERE id = NEW.id)
Then
Return NULL;
else
Return NEW;
End If;
End;
$$ language plpgsql;

--触发器创建

create trigger my_trigger before insert on test_trigger for each row execute procedure insert_row_trigger();

--删除触发器

drop trigger my_trigger on test_trigger

错误

错误:函数无法在段上执行,因为它访问 关系“jiodba.test_trigger”(functions.c:151)(seg1 SRDCB0002GPM02:40001 pid=11366) (cdbdisp.c:1477) 详细信息:SQL 语句“SELECT 存在(SELECT 1 FROM test_trigger WHERE id = $1)” PL/pgSQL 函数“insert_row_trigger”第 2 行的 if

**********错误**********

错误:函数无法在段上执行,因为它访问关系 "jiodba.test_trigger" (functions.c:151) (seg1 SRDCB0002GPM02:40001 pid=11366) (cdbdisp.c:1477) SQL 状态:XX000 详细信息:SQL 语句 “SELECT 存在(SELECT 1 FROM test_trigger WHERE id = $1)”PL/pgSQL 函数“insert_row_trigger”第 2 行在 if

请帮助我。 ~我还在某处读到 GP 不支持触​​发器

【问题讨论】:

您的最后一行是正确的 - GP 不支持触​​发器。 【参考方案1】:

触发器是在每个输入数据行的段级别上执行的函数。问题在于,在 Greenplum 中,您无法从段级别执行任何查询,因为它需要每个段重新连接到主服务器以单独执行它,这将导致大型系统的连接膨胀。 克服这个问题的方法是这样的:

    在父表上有一个唯一索引 在单个事务中,执行两条语句:首先,将父表中不存在的所有行插入到父表中。其次,将所有输入行插入到目标表中,其中键刚刚插入到父表中。

一般来说,你会有相同的逻辑,但没有触发器

【讨论】:

以上是关于在 Greenplum 中使用触发器时出错的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 oracle 中触发时出错

使用 PL/SQL 块创建触发器时出错

错误:部署云功能时解析触发器出错 - Firebase

在 DB2 中使用 MERGE 命令时出错

尝试使用 pyspark 访问 greenplum 表时出错

创建触发器时出错