如果您有任何人在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
不支持触发器的地方答案 0 :(得分:1)
触发器是在每个输入数据行的段级别上执行的功能。问题在于,在Greenplum中,您无法从段级别执行任何查询,因为它需要每个段重新连接到主站以单独执行它,这将导致大型系统的连接膨胀。 克服这个问题的方法就是这样:
通常,您将拥有相同的逻辑,但没有触发器