当布尔字段设置为 true 时,postgres 更新日期字段

dla*_*and 4 postgresql triggers date plpgsql

为了这个例子,考虑一个表

create table foo (
  contents text NOT NULL,
  is_active boolean NOT NULL DEFAULT false,
  dt_active date
)
Run Code Online (Sandbox Code Playgroud)

我插入一条记录:

insert into foo (contents) values ('bar')
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好。稍后,我现在想“激活”记录:

update foo set is_active = true
Run Code Online (Sandbox Code Playgroud)

is_activefalse变为 时true,我想做的是将fordt_active设置为now()。对于奖励积分,如果is_active从更改truefalse,dt_active 设置为 null,那会很好,但我可以没有它。

我真的很想将这种内务管理推送到数据库中,它会使客户端代码更清晰(因为许多表(甚至表中的列元组)都可以从这种技术中受益)。

我很难过如何在触发器中提取数据库中的当前记录(我正在使用 plpgsql),以便将“then”与“now”进行比较。非常感谢指向代码示例或片段的指针。

小智 5

CREATE OR REPLACE FUNCTION trg_update_foo() RETURNS TRIGGER AS
$BODY$
BEGIN
    IF OLD.is_active = false AND NEW.is_active = true THEN
        NEW.dt_active := now();
    ELSIF OLD.is_active = true AND NEW.is_active = false THEN
        NEW.dt_active := NULL;
    END IF;
    RETURN NEW;
END;
$BODY$
LANGUAGE 'plpgsql';
CREATE TRIGGER trg_update_foo BEFORE UPDATE ON foo FOR EACH ROW EXECUTE PROCEDURE trg_update_foo();
Run Code Online (Sandbox Code Playgroud)

应该管用。有关更多信息,请查看 pl/PgSQL触发器手册,以及额外的点 - 整个plPgSQL文档。