在 Postgresql 中使用触发器更新日期

Update date using triggers in Postgresql

我有一个 table,它有一个合同和像 starting_date 和 expiration_date 这样的列。我需要为特定类别(私人)创建一个触发器,一旦我们到了到期日期(也就是今天到期),更新一年。

我不太明白的是,如果我需要执行更新来触发 TRIGGER,我该如何更新日期。

就像我正确理解 TRIGGERS 一样,我需要执行更新语句来触发我的 TRIGGER 并让它完成它的工作。但如果这是正确的,那么我应该更新什么来触发它?

对于 TRIGGER,显然如果我 old.expiration_date == 当前日期 那么我就会知道它今天是否会过期。

例如,假设我们有一份合同:

starting_date: 1998/02/01

expiration_date: 2021/06/24

当前日期:2021/06/24

所以现在我需要触发 TRIGGER 并更新此日期,但是如何?

这里是table:

CREATE TABLE insurance_premiums (
    contract_code text NOT NULL,
    insurance_team text NOT NULL,
    starting_date date NOT NULL,
    expiration_date date NOT NULL,
    contract_cost float8 NOT NULL,
    vehicle_contract text NOT NULL,
    customer_contract text NOT NULL,
    driver_contract text NOT NULL,
    CONSTRAINT insurance_premiums_pkey PRIMARY KEY (contract_code)
);

下面是针对上述示例日期的 INSERT INTO 语句

INSERT INTO insurance_premiums (contract_code, insurance_team, starting_date, expiration_date, contract_cost, vehicle_contract, customer_contract, driver_contract) 
VALUES
('FX-30592', 'private', '1998-02-01', '2021-06-24', 3894.68, 'Cavalier', 'Nicoline Vaughn', 'Helen-elizabeth Galiero');

这里还有TRIGGER:

CREATE TRIGGER update_contract
    BEFORE UPDATE ON insurance_premiums
    FOR EACH statement 
    EXECUTE procedure new_date();

触发器的空函数

CREATE OR REPLACE FUNCTION public.new_date()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$
    BEGIN
        
        
    END;
$function$
;

同样,TRIGGER 需要自动更新日期,但我不明白我如何“调用”它以及它如何工作

您不能使用触发器让动作按时间触发。触发器只能在 数据修改 上触发,即 INSERTUPDATEDELETETRUNCATE 语句。这不是你需要的。

您必须通过 运行 一个 DELETE 语句安排一个使旧条目过期的常规作业。可以使用操作系统工具(如 Unix 系统上的 cron)或(非标准)数据库扩展(如 pg_timetable.

来安排此类作业

如果一天左右使数据过期一次是可以的,那将有效。如果您需要更高的准确性,我建议您修改 SELECT 语句,以便它们忽略过期数据。然后就不用急着让它们过期了。

如果数据过期的粒度较粗 (day/week/month),则范围分区可能是最佳选择。这将允许您简单地删除一个分区而不是 运行 一个长 DELETE.