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

时间:2021-06-24 09:15:21

标签: sql postgresql triggers

我有一个表,里面有一个合同和一些列,比如starting_date 和expiration_date。我需要为特定类别(私人)创建一个触发器,一旦我们在到期日期(也就是今天到期),将其更新一年。

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

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

对于 TRIGGER,如果我执行 old.expiration_date == 当前日期,那么我将知道它是否会在今天到期。

例如,假设我们与以下机构签订了合同:

开始日期:1998/02/01

expiration_date:2021/06/24

当前日期:2021/06/24

所以现在我需要触发那个 TRIGGER 并更新这个日期,但是怎么做?

这是表格

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');

这也是触发器

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$
;

再次触发需要自动更新日期,但我不明白我如何“调用”它以及它是如何工作的

1 个答案:

答案 0 :(得分:0)

您不能使用触发器来按时间触发操作。触发器只能对数据修改触发,即 INSERTUPDATEDELETETRUNCATE 语句。这不是您在这里需要的。

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

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

如果您对数据到期有较粗的粒度(天/周/月),则范围分区可能是最佳选择。这将允许您简单地删除分区而不是运行长 DELETE