【问题标题】:PostgreSQL trigger function update errorPostgreSQL 触发函数更新错误
【发布时间】:2017-11-01 00:23:19
【问题描述】:

我似乎无法在逻辑上放置这个错误,不像大多数人几乎没有提供关于原因的信息(通常看起来他们的预处理器非常好,或者你可以深入研究逻辑,但在这里我没有错误。 我还有另一个运行良好的功能,它添加了这些键,所以不是那个.. 否则交易似乎失败了,当我进入时我进入了终端

 update guest_list set coatcheck = true where ticket_number = 3;

"PL/pgSQL 函数 coatcheck_gen() 第 8 行 SQL 语句 SQL 语句“更新 guest_list 设置coatcheck_num = coat_num where ticket_number = old.ticket_number” PL/pgSQL 函数 coatcheck_gen() 第 8 行 SQL 语句 SQL语句“更新guest_list set coatcheck_num = coat_num where 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();

【问题讨论】:

  • 我还没有完全理解你想要达到什么目的。
  • 您创建了一个trigger after update for each row 并在触发器内部更新了同一个表。是你的真实意图吗?如果这是您的想法,那么出了什么问题?你的交易有例外吗?您对每一行都有一个例外,或者您没有例外,但它看起来不对?
  • 是的。所以,当coat-check bool 修改为true 时,它​​会创建一个coat-check 编号。并将其添加到表中。这只发生在有人参加之后。并在宾客名单上。 (创建票号的功能,在类型事件的贡献上都很好。我有一个例外,确保一个人必须在添加外套检查之前“参加”。所以,当且仅当“外套检查”被更改时才会触发. 在那些行上。一旦发生这种情况,触发器应该转到函数并创建一个 coatcheck_number ..

标签: postgresql plpgsql


【解决方案1】:

您正在通过更新触发器内的表来进行无限循环。 您首先调用它并设置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

【讨论】:

  • 嗯哦!我明白你对循环的意思。尽管提出了更改。 “错误:要更新的元组已被当前命令触发的操作修改提示:考虑使用 AFTER 触发器而不是 BEFORE 触发器将更改传播到其他行。”。嗯,“new.coatcheck_num = coat_num”错误:关系“guest_list”的“新”列不存在第 1 行:更新 guest_list 集 new.coatcheck_num = coat_num 其中 ti...
  • @Zepalz 不不,替换整行,而不仅仅是其中的一部分
  • 哦哦。我得到它。是的,这一切都让战利品更有意义。是的,谢谢。
猜你喜欢
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多