我有一个使用时间 postgres 表的触发功能。它由定义为 tstzrange 的“sys_period”变量进行版本控制。我可以看到我的触发器失败了,因为它不只过滤表中的活动行。
CREATE OR REPLACE FUNCTION update_analysis_{0}_function()
RETURNS trigger
LANGUAGE 'plpgsql'
AS
$$
BEGIN
UPDATE analysis
SET finish_date = (
SELECT STRICT_MAX(performed_on)
FROM task
WHERE analysis_id = NEW.analysis_id
)
WHERE id = NEW.analysis_id;
return NEW;
END;
$$;
CREATE TRIGGER update_analysis_{0}
AFTER INSERT OR DELETE OR UPDATE OF performed_on
ON task
FOR EACH ROW
EXECUTE PROCEDURE update_analysis_{0}_function();
分析表和任务表都使用 sysperiod 进行版本控制。( strict_max 来自https://wiki.postgresql.org/wiki/Aggregate_strict_min_and_max)
当前版本有错误,如果我可以过滤 sys_period 未结束,则可以修复这些错误。使身体看起来像这样:
BEGIN
UPDATE analysis
SET finish_date = (
SELECT STRICT_MAX(performed_on)
FROM task
WHERE analysis_id = NEW.analysis_id
AND task.sys_period.end = NULL
)
WHERE id = NEW.analysis_id;
AND Analysis.sys_period.end = NULL
return NEW;
END;