我有一个表,里面有一个合同和一些列,比如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$
;
再次触发需要自动更新日期,但我不明白我如何“调用”它以及它是如何工作的
答案 0 :(得分:0)
您不能使用触发器来按时间触发操作。触发器只能对数据修改触发,即 INSERT
、UPDATE
、DELETE
和 TRUNCATE
语句。这不是您在这里需要的。
您必须通过运行 DELETE
语句来安排使旧条目过期的常规作业。可以使用操作系统工具(如 Unix 系统上的 cron
)或通过(非标准)数据库扩展(如 pg_timetable
)来安排此类作业。
如果可以每天使数据过期一次,这将起作用。如果您需要更高的准确性,我建议您修改 SELECT
语句,以便它们忽略过期数据。然后就不用急着让它们过期了。
如果您对数据到期有较粗的粒度(天/周/月),则范围分区可能是最佳选择。这将允许您简单地删除分区而不是运行长 DELETE
。