插入触发器后未给出期望的结果

问题描述

我在名为pohead的表上有一个触发器

CREATE TRIGGER poautorelease
  AFTER INSERT OR UPDATE 
  ON public.pohead
  FOR EACH ROW
  EXECUTE PROCEDURE public._poautorelease();

触发功能

BEGIN
 IF (TG_OP = 'UPDATE' AND NEW.pohead_printed = TRUE) 
 OR (TG_OP = 'INSERT' AND NEW.pohead_printed = TRUE) THEN
   PERFORM releasepurchaSEOrder(NEW.pohead_id);
 END IF;
 RETURN NEW;
END

似乎在UPDATE上执行了功能releasepurchaSEOrder(),而在INSERT上未执行。 我在代码中做错什么了吗?还是我需要在其他地方寻找问题。

我看过一些详细介绍FOR EACH ROW的帖子。但每次更新或插入都只有一行。我认为我可能错误地使用了NEW变量。

我可能会考虑的另一种可能性是代码是否正确,也许是在插入之前禁用了触发器?我不知道这是否可行,但我认为一定可以。

解决方法

如果我创建了一个具有故事意义的函数,则该函数对我来说都适用于插入和更新。

create function releasepurchaseorder(int) returns void language plpgsql as $$ 
BEGIN
    RAISE NOTICE 'asfdasfda'; 
END;
$$;

当然提供pohead_printed实际上是正确的。

因此,如果您认为确实存在问题,请说明您是如何确定不触发的,并显示一个完全复制案例(包括表的完整定义以及两个函数的完整定义) )。当然,您可以简化表格和函数,但是请验证简化版本是否仍然具有您所描述的行为。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...