我有一个表,它有一个契约和starting_date和expiration_date等列。我需要创建一个触发器,一旦我们到了到期日(也就是说,如果它今天到期(,就为特定类别(私人(更新一年。
我真正不明白的是,如果我需要更新以触发触发器,我该如何更新日期。
就像如果我正确理解TRIGGER一样,我需要执行一个Update语句来激发我的TRIGGER并让它完成它的工作。但如果这是正确的,那么我该更新什么来启动它?
显然,对于触发器,如果我执行old.expiration_date==当前日期,那么我就会知道它今天是否会过期。
例如,假设我们与签订了合同
开始日期:1998/02/01
到期日期:2021/06/24
当前日期:2021/06/24
所以现在我需要启动触发器并更新日期,但如何更新?
这是表:
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$
;
触发器再次需要自动更新日期,但我不明白我是如何";呼叫";它以及它将如何工作
不能使用触发器使操作由时间触发。触发器只能在数据修改时触发,即INSERT
、UPDATE
、DELETE
和TRUNCATE
语句。这不是你在这里需要的。
您必须通过运行DELETE
语句来安排一个使旧条目过期的常规作业。这样的作业既可以使用操作系统工具(如Unix系统上的cron
(进行调度,也可以使用(非标准(数据库扩展(如pg_timetable
(进行调度。
如果数据每天过期一次左右是可以的,那就行了。如果你需要更准确的数据,我建议你修改你的SELECT
语句,让它们忽略过期的数据。这样就不会急于让它们过期。
如果数据到期的粒度较粗(天/周/月(,则范围分区可能是最好的选择。这将允许您简单地删除一个分区,而不是运行一个长的DELETE
。