每次我将structure.sql转储到rails应用程序上时,我得到的是PROCEDURE而不是FUNCTION。FUNCTION是我们的默认设置,我必须提交文件的各个部分,这很烦人,有时我会漏掉行,这更糟糕,因为它是一个相当大的structure.sql文件。
git差异示例:
-CREATE TRIGGER cache_comments_count AFTER INSERT OR DELETE OR UPDATE ON public.comments FOR EACH ROW EXECUTE PROCEDURE public.update_comments_counter();
+CREATE TRIGGER cache_comments_count AFTER INSERT OR DELETE OR UPDATE ON public.comments FOR EACH ROW EXECUTE FUNCTION public.update_comments_counter();
我肯定在某个地方有一个postgresql设置,但是我找不到。
2条答案
按热度按时间e4yzc0pl1#
无论你使用函数还是过程,你得到的结果都是一样的。
这意味着您可以使用术语FUNCTION或PROCEDURE,但无论使用哪种方式,function_name 总是被调用。请参见demo。对于演示,我为
insert
和update
提供了单独的触发器。使用execute procedure
插入,使用execute function
更新。这在Postgres中无法更改,它必须是Rails设置。**注意:**在v11之前,Postgres只允许 * 执行过程 *,即使您必须创建一个被调用的触发器function
。n9vozmp42#
在Postgres 11和12之间,函数
pg_get_triggerdef()
在Postgres引入了真实的的过程时发生了变化。从Postgres 12开始,它总是返回一个使用EXECUTE FUNCTION
的语法,因为实际上它是一个在触发器触发时调用的函数,而不是一个过程。所以这段代码:
在Postgres 11和更早版本中返回以下内容:
以及Postgres 12和更高版本中的以下内容:
我猜Rails使用
pg_get_triggerdef()
来获取触发源。所以你无能为力。如果你想得到一致的结果,你应该在任何地方使用相同的Postgres版本。