我在一张桌子上有 2 个触发器;一个适用于 INSERT:
CREATE TRIGGER "get_user_name"
AFTER INSERT ON "field_data"
FOR EACH ROW EXECUTE PROCEDURE "add_info"();
这会更新表中的一些值。
还有一个用于更新(填写历史表):
CREATE TRIGGER "set_history"
BEFORE UPDATE ON "field_data"
FOR EACH ROW EXECUTE PROCEDURE "gener_history"();
问题是,当我在表中插入新行时,该过程"add_info"()
会进行更新并因此触发第二个触发器,该触发器以错误结束:
ERROR: record "new" has no field "field1"
我怎样才能避免这种情况?
(触发器逻辑明显错误。)
在Postgres 9.2或更高版本中,使用@Akash在触发器本身的条件中已经
pg_trigger_depth()
提到的函数(而不是触发器函数的主体),这样触发器函数就不是偶数了当从另一个触发器调用时执行(包括它自己 - 所以也防止循环)。 这通常表现更好,更简单,更干净:在输入触发函数之前
pg_trigger_depth() < 1
计算表达式。所以它在第一次调用时评估为 0。当从另一个触发器调用时,该值较高且不执行触发器函数。如果您不希望在从插入触发器中调用更新触发器时执行更新触发器,您可以使用
pg_trigger_depth()
返回深度的条件包围您的语句,当您从另一个触发器直接/间接运行触发器时,该条件不会为 0 .所以,在你的函数
gener_history()
中,你可以做这样的事情这是另一个例子: http: //www.depesz.com/2012/02/01/waiting-for-9-2-trigger-depth/
建议 #1
从您的应用程序中删除
AFTER INSERT
触发器和调用add_info
建议 #2
AFTER INSERT
将触发器更改为BEFORE INSERT