[英]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';
我是否必须对函数中的逻辑进行编程并根据结果返回NULL或NEW ,还是有一个简单的解决方案?
无论新值是否与旧值不同,都将执行UPDATE
,并且触发器也是如此。
三种可能的解决方案:
正如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();
像这样编写触发过程:
IF (OLD IS DISTINCT FROM NEW) THEN NEW."modified_on" = now(); RETURN NEW; END IF;
使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.