【问题标题】:Update date using triggers in Postgresql在 Postgresql 中使用触发器更新日期
【发布时间】:2021-09-07 18:43:48
【问题描述】:

我有一个表,其中包含一个合同和诸如starting_date 和expiration_date 之类的列。我需要为特定类别(私人)创建一个触发器,一旦我们处于到期日期(也就是今天到期),将其更新一年。

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

如果我正确理解了 TRIGGERS,我需要执行一条更新语句来触发我的 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');

这也是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 再次需要自动更新日期,但我不明白我如何“调用”它以及它是如何工作的

【问题讨论】:

  • 这不是触发作业。您需要一种作业调度程序来每天运行一次预期的更新。或者,创建一个可以即时修改相关日期的视图。
  • 另外,您不应该将钱存储在浮点变量中。并且 insurance_team 似乎是外键的候选者。
  • 好的,谢谢大家的回答!我是 SQL 的初学者,我还在学习。我应该如何存钱?我认为如果它的双精度浮点数会适合。另外我会用不同的东西来测试触发器,我现在正在学习触发器,所以我想用一些东西来测试它们。但这似乎不是触发工作。

标签: sql postgresql triggers


【解决方案1】:

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

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

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

如果您对数据过期的粒度(日/周/月)更粗略,范围分区可能是最佳选择。这将允许您简单地删除一个分区而不是运行很长的DELETE

【讨论】:

  • 感谢您对问题和可能的解决方案的深入详细解释!
猜你喜欢
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多