psql 以前创建的函数在退出后消失了
psql previous created functions disappeared after quit
以下是我在linux环境中遇到的步骤和问题:
- 我运行
psql -d mimic -U postgres -W
登录psql
- I 运行
\i postgres-function.sql
并使用 \df
显示函数列表。它确实在适当的模式下显示了我想要的功能
- 我运行
\q
退出psql
- 我运行
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
以下是我在linux环境中遇到的步骤和问题:
- 我运行
psql -d mimic -U postgres -W
登录psql
- I 运行
\i postgres-function.sql
并使用\df
显示函数列表。它确实在适当的模式下显示了我想要的功能 - 我运行
\q
退出psql
- 我运行
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