0

我有一个使用时间 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;
4

1 回答 1

1

我正在寻找的功能是upper_inf。给出以下解决方案:

 UPDATE analysis
    SET finish_date = (
        SELECT STRICT_MAX(performed_on)
        FROM task
        WHERE analysis_id = NEW.analysis_id 
        AND upper_inf(task.sys_period)
        )
    WHERE id = NEW.analysis_id;
    AND upper_inf(task.sys_period)
    return NEW;
END;
于 2019-09-10T09:10:54.767 回答