在Greenplum中使用Trigger时出错

时间:2014-12-17 13:44:40

标签: triggers greenplum

如果您有任何人在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)DETAIL:SQL   语句" SELECT存在(SELECT 1 FROM test_trigger WHERE id = $ 1)"   PL / pgSQL函数" insert_row_trigger"第2行,如果

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

  

错误:函数无法在段上执行,因为它访问关系   " 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的   function" insert_row_trigger"第2行,如果

请帮我解决这个问题  〜我还读到了GP

不支持触发器的地方

1 个答案:

答案 0 :(得分:1)

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

  1. 在Parent表上有唯一索引
  2. 在单个事务中,执行两个语句:首先,插入父选择父表中不存在的所有行。其次,使用刚刚插入父表的键将所有输入行插入目标表。
  3. 通常,您将拥有相同的逻辑,但没有触发器