PostgreSQL触发函数更新错误

时间:2017-11-01 00:23:19

标签: postgresql plpgsql

我似乎无法逻辑地将这个错误产生,不像大多数人几乎没有提供任何关于原因的信息(通常看起来他们非常好的预处理器或你可以深入了解逻辑,但在这里我没有得到任何错误。 我还有另一个功能正常,添加这些键,所以它不是.. 然后交易似乎失败了,当我进入

时我进入终端
 update guest_list set coatcheck = true where ticket_number = 3;
  

" PL / pgSQL函数coatcheck_gen()在SQL语句中的第8行   SQL语句"更新guest_list set coatcheck_num = coat_num,其中ticket_number = old.ticket_number"   PL / pgSQL函数coatcheck_gen()在SQL语句中的第8行   SQL语句"更新guest_list set coatcheck_num = coat_num,其中ticket_number = old.ticket_number"

这会继续页面,然后结束。 我试过用新的。旧。或者只是要看的数字。没别的了。同样的错误。 所有的表都很好。刚完成命令时所有更新都有效。 它出现在其他地方似乎是正确的......

功能是

 create or replace function coatcheck_gen() returns trigger as $gencoatcheck$
declare
coat_num bigint; 
begin 
IF (TG_OP = 'UPDATE') then
if ( new.coatcheck = true ) then
coat_num := (old.frkey_id_event + old.frkey_id_guest);
update guest_list set coatcheck_num = coat_num where ticket_number = old.ticket_number;
return new; 
END IF;
return new; 
end if; 
return new; 
end;
$gencoatcheck$ LANGUAGE plpgsql;

触发

create trigger trg_coatchek_gen after update on guest_list for each row when (new.coatcheck = true) execute Procedure coatcheck_gen();

1 个答案:

答案 0 :(得分:0)

您通过更新触发器内的表来进行无限循环。 你先调用它并设置coatcheck = true,然后触发器再次更新表,但是从coatcheck = true开始它将被触发器再次处理(这个循环永远不会结束)。

你可以替换整行

update guest_list set coatcheck_num = coat_num where ticket_number = old.ticket_number;

通过

new.coatcheck_num = coat_num;

并制作触发器before update