psql 以前创建的函数在退出后消失了

psql previous created functions disappeared after quit

以下是我在linux环境中遇到的步骤和问题:

  1. 我运行psql -d mimic -U postgres -W登录psql
  2. I 运行 \i postgres-function.sql 并使用 \df 显示函数列表。它确实在适当的模式下显示了我想要的功能
  3. 我运行\q退出psql
  4. 我运行psql -d mimic -U postgres -W登录psql,然后运行\df再次登录。但是,它显示一个空 table。之前存储的函数自动消失

之所以我想在psql\q是因为我想运行在.sh脚本中创建函数。有人能说出之前创建的函数消失的原因吗?谢谢!

我正在阅读https://www.postgresql.org/docs/current/xfunc-sql.html#XFUNC-SQL-BASE-FUNCTIONS

我连接到 9.6.22 服务器(不是“postgres”), 并在示例中定义 one() 。 我可以从中 SELECT,然后用 \df

查看它

断开连接后 re-connecting, 我仍然可以从中 SELECT,并用 \df

查看它

我连接到 11.10 服务器并获得了相同的结果。

tl;dr:无法重现所报告的问题。

也许您作为用户 (-U postgres) 连接时缺少对 public 模式中新函数的写入权限? 或者涉及一个临时 table,一个在 TCP 断开连接时丢弃?

您对 postgres-function.sql 的内容含糊不清。 似乎细节是密切相关的 如果我们想一探究竟。

编辑

好的,谢谢你的详细信息。 最大的区别似乎是 PLPGSQL。 我尝试从文档中定义一个简单的函数:

CREATE FUNCTION foo(f1 int) RETURNS int AS $$
DECLARE
  f1 int;
BEGIN
  RETURN f1;
END;
$$ LANGUAGE plpgsql;

在 re-connecting 之后,我仍然可以将它与 SELECT 和 \df

一起使用

然后我在 source code 中注意到了这个细节:

SET search_path TO mimiciii;

您没有创建 REGEXP_EXTRACT(), 未创建 public.REGEXP_EXTRACT()。 不,不是很远。

您正在创建 mimiciii.REGEXP_EXTRACT()

\i命令使搜索路径生效 剩下的 session。 当您开始 new session 时, 您将需要发出 另一个 搜索路径指令 如果您希望通过“短”名称引用函数。 或者,您可以选择使用“长”名称 SELECT 或 \df