繁体   English   中英

更新后的PostgreSQL执行过程(值已更改)

[英]Postgresql execute procedure on update (value changed)

我有以下trigger它调用update_recipe_timestamp_proc function ,其更新modified_on列。 如果插入/更新了相同的值,尽管未提供新值,但仍会触发trigger

触发

CREATE TRIGGER update_recipes_timestamp_r 
BEFORE UPDATE OF "identifier", "name", "description"
ON recipes 
FOR EACH ROW EXECUTE PROCEDURE update_recipe_timestamp_proc();

功能

CREATE OR REPLACE FUNCTION update_recipe_timestamp_proc()
RETURNS TRIGGER AS $$
BEGIN
    NEW."modified_on" = now();
    RETURN NEW;   
END;
$$ language 'plpgsql';

我是否必须对函数中的逻辑进行编程并根据结果返回NULLNEW ,还是有一个简单的解决方案?

无论新值是否与旧值不同,都将执行UPDATE ,并且触发器也是如此。

三种可能的解决方案:

  1. 正如Sevanteri的评论所建议,使用

     CREATE TRIGGER update_recipes_timestamp_r BEFORE UPDATE OF "identifier", "name", "description" ON recipes FOR EACH ROW WHEN (OLD IS DISTINCT FROM NEW) EXECUTE PROCEDURE update_recipe_timestamp_proc(); 
  2. 像这样编写触发过程:

     IF (OLD IS DISTINCT FROM NEW) THEN NEW."modified_on" = now(); RETURN NEW; END IF; 
  3. 使UPDATE有条件:

     UPDATE recipes SET "identifier" = val1, "name" = val2, "description" = val3 WHERE ... AND "identifier" <> val1 OR "name" <> val2 OR "description" <> val3; 

解决方案与WHEN只更新特定的列变化modified_on列。

CREATE TRIGGER update_recipes_timestamp_r BEFORE 
UPDATE ON recipes FOR EACH ROW
WHEN (
OLD."name" <> NEW."name" OR 
OLD."description" <> NEW."description" OR
OLD."identifier" <> NEW."identifier")
EXECUTE PROCEDURE update_recipe_timestamp_proc();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM