有两张表行程和路线。我创建了一个触发器来更改要更新的trips 表和一个触发器函数来计算当月的总数。
create or replace function month_sum_update1() returns trigger as
$BODY$
DECLARE
summ int;
BEGIN
select sum(quantity*price) into summ from trips, routes
WHERE trips.id_route = routes.id_route
AND (date_travel<=now() AND date_travel>=now()-interval '1 month');
UPDATE trips set all_sum_column = summ;
return new;
END;
$BODY$
language plpgsql;
create trigger on_date_insert_update1 before update on trips
FOR EACH ROW
EXECUTE PROCEDURE month_sum_update1();
接下来我做一个更新:
update trips set quantity = 5 where id_trip = 9;
给出错误消息:
ERROR: ОШИБКА: превышен предел глубины стека
HINT: Увеличьте параметр конфигурации "max_stack_depth" (текущее значение 2048 КБ), предварительно убедившись, что ОС предоставляет достаточный размер стека.
CONTEXT: SQL-оператор: "select sum(quantity*price) from trips, routes
WHERE trips.id_route = routes.id_route
AND (date_travel<=now() AND date_travel>=now()-interval '1 month')"
функция PL/pgSQL month_sum_update1(), строка 5, оператор SQL-оператор
SQL-оператор: "UPDATE trips set all_sum_column = summ"
функция PL/pgSQL month_sum_update1(), строка 8, оператор SQL-оператор
SQL-оператор: "UPDATE trips set all_sum_column = summ"
如何正确修复功能和触发?
您的触发器在 BEFORE UPDATE 事件上触发,并在其中发生另一个更新,再次调用此触发器,导致无限递归。
此外,更新本身看起来有点奇怪:
当您更新其中一个时,您真的想将
all_sum_column
所有表记录更新为相同的值吗?我相信这只是代码中的一个错误(因为您在计算 sum 时只考虑当前条目
trips.id_route = routes.id_route
)并且您只想从tips
. 在这种情况下,有必要更新不是通过update
,而是使用触发器内部可用的特殊关键字 -NEW
(它代表正在更新的字符串的新版本,还有OLD
- 分别是以前的版本):这不会导致再次执行下一个触发器。
触发器将如下所示:
官方文档中有关触发器的更多信息。