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