指定triger以更新时间戳字段

时间:2015-06-03 17:11:37

标签: sql postgresql triggers updates ddl

这是一个跟进问题: old example

CREATE TABLE "x"."y"(
    "z" timestamp NOT NULL,
    "a" Timestamp NOT NULL DEFAULT z + 18 months,
);

我希望指定一个触发器,一旦更新z,就会更新a。

的内容
CREATE TRIGGER a_update
    AFTER UPDATE on z
    on x.y
    NEW.a = NEW.z + interval '18 months'

你能帮我解释一下语法吗?

2 个答案:

答案 0 :(得分:1)

由于您的方案中的a 始终z之后的18个月,因此实际存储在任何地方都没有意义。将它作为视图中的计算列会更容易:

CREATE VIEW y_view AS 
SELECT z, z + INTERVAL '18 MONTH' AS a 
FROM   y;

答案 1 :(得分:0)

PostgreSQL中的触发器是通过首先创建一个函数,然后将该函数作为documented in the Postgres manual附加到适当的表来实现的。

manual page for CREATE TRIGGER有这个例子,应该很容易适应你的实际名字:

CREATE TRIGGER check_update
    BEFORE UPDATE ON accounts
    FOR EACH ROW
    WHEN (OLD.balance IS DISTINCT FROM NEW.balance)
    EXECUTE PROCEDURE check_account_update();

对于实际触发功能的定义,你只需要填写这个的主体; OLDNEW别名表示整行的旧值和新值:

CREATE FUNCTION my_trigger() RETURNS trigger
    AS $$
        NEW.foo := OLD.foo + 1;
        RETURN NEW;
    $$
    LANGUAGE plpgsql;

还有更多注释和示例on this manual page