PostgreSQL的 - 扳机,现场更新更新时间戳(postgresql - trigger, u

2019-10-23 14:30发布

背景:我们有一个completed_flag即默认为0,并更新1,当一个人完成了问卷调查。 我想记录此更新发生的时间戳

写这个触发器/功能,当标记被从0触发1更新时间戳记后,我质疑我是否这样做的最佳方式。 我怀疑它是不是要做到这一点的最好办法,但我有点新的Postgres的。 触发器可以调用的函数,只有当该值发生变化? 这将消除检查该值每行更新,这似乎过度需求

-- add new column to store time the respondent completed
ALTER TABLE  tbl_pXXXX ADD COLUMN complete_time timestamp without time zone;


-- function to insert timestamp
CREATE FUNCTION completed_timestamp() RETURNS trigger AS $$
   LANGUAGE plpgsql
BEGIN
 IF new.complete_flag = 1 and old.completed_flag = 0
            THEN UPDATE tbl_pXXXX
            SET complete_time = current_timestamp
END;
$$;

-- trigger to call the function
CREATE TRIGGER update_timestamp
AFTER UPDATE ON tbl_pXXXX
FOR EACH ROW 
EXECUTE PROCEDURE completed_timestamp();

Answer 1:

只要你只更改了其触发触发器的行,这是简单得多(便宜)使用BEFORE UPDATE触发器,它可以改变new.complete_flag之前它保存到表中,而不必运行一个UPDATE它已经在那里后声明。

您还可以限制触发与特定字段更新UPDATE OF <column>的子句CREATE TRIGGER语句。

最终的结果会是这个样子:

CREATE FUNCTION completed_timestamp() RETURNS trigger AS $$
   LANGUAGE plpgsql
BEGIN
  IF new.complete_flag = 1 and old.completed_flag = 0 THEN
    new.complete_time := current_timestamp;
  END IF;
  RETURN new;
END;
$$;

CREATE TRIGGER update_timestamp
BEFORE UPDATE OF completed_flag ON tbl_pXXXX
FOR EACH ROW 
EXECUTE PROCEDURE completed_timestamp();


文章来源: postgresql - trigger, update timestamp on field update