为了举例,请考虑一个表

create table foo (
  contents text NOT NULL,
  is_active boolean NOT NULL DEFAULT false,
  dt_active date
)

我插入一条记录:

insert into foo (contents) values ('bar')

到目前为止,这么好。后来,我现在要“激活”记录:

update foo set is_active = true

is_active false 更改为 true 时,我想做什么,对于 dt_active 是设置为 now()。对于奖励积分,如果 is_active true 更改为 fals e,dt_active设置为null,那将是很好的,但我可以没有它

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

我很难过如何在触发器中拉出数据库中的当前记录(我正在使用plpgsql),以便比较“then”和“then”。与“现在”。代码示例或代码片段的指针非常受欢迎。

有帮助吗?

解决方案

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();

应该有效。有关更多信息,请查看pl / PgSQL 触发器手册,以及加分 - 整个 plPgSQL 文档。

其他提示

在plpgsql触发器过程中,您可以访问为您创建的一些名为 NEW OLD 的特殊记录类型变量。

UPDATE INSERT 触发器中, NEW 将代表新数据库行的记录。

UPDATE DELETE 触发器中, OLD 将表示原始数据库行的值。

在其他语句环境中,这些记录变量将是 NULL

因此,您似乎需要创建一个 INSERT OR UPDATE 触发器,该触发器查看 OLD.is_active NEW.is_active

这是文档页面 - http://www.postgresql。 org / docs / 8.1 / interactive / plpgsql-trigger.html 此页面包含使用 NEW OLD

的plpgsql示例代码

您是否尝试过手册

每个触发器功能都有一些自动变量。在更新触发器的情况下,可通过 OLD 访问旧行值,并通过 NEW

访问更改的值

您只需通过 OLD.is_active 检查OLD的列值。您可以更改要放入数据库的值,如 NEW.dt_active:= now();

希望这一切。

CREATE FUNCTION actrigger() RETURNS TRIGGER AS $ BEGIN
    IF TG_OP='UPDATE' THEN
        IF NEW.is_active THEN
            IF NOT OLD.is_active THEN
                NEW.dt_active := current_date;
            END IF;
        ELSIF NEW.dt_active IS NOT NULL
            NEW.dt_active := NULL;
        END IF;
    END IF;
    RETURN NEW;
END; $ LANGUAGE plpgsql;
CREATE TRIGGER foobefore BEFORE UPDATE ON foo FORR EACH ROW
    EXECUTE PROCEDURE actrigger();

你也可以照顾 INSERT ,除非它不应该引用 OLD ,否则它会非常相似。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top