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_active从false变为 时true,我想做的是将fordt_active设置为now()。对于奖励积分,如果is_active从更改true为false,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文档。
| 归档时间: |
|
| 查看次数: |
11957 次 |
| 最近记录: |