附加模块 citext 已安装,但未找到类型 "citext"?

Additional module citext is installed, but type "citext" not found?

我正在尝试 运行 我的数据库上的内联查询 - 安装了 citext 扩展(使用 CREATE EXTENSION) - 但执行的查询不断抛出此错误调用函数时:

type "citext" does not exist 
DO
LANGUAGE plpgsql
$$
DECLARE
  _id INT;
BEGIN
  SELECT * FROM "dbo"."MyFunction"(_id, 'some value'::citext);
END;
$$;

如果我省略 ::citext 转换,它会说:

function dbo.MyFunction(integer, unknown) does not exist.
You might need to add explicit type casts.

添加了 citext 扩展,它是架构的一部分,可与其他查询一起使用。这总是随机出现 - 是什么原因造成的?

编辑: 安装的扩展:

extname   | nspname
----------+-----------
plpgsql   | pg_catalog
citext    | public
uuid-ossp | public

搜索路径:

show search_path;
search_path
-----------
dbo

据推测,search_path 中缺少扩展架构。在这个相关答案中阅读如何设置模式搜索路径:

  • How does the search_path influence identifier resolution and the "current schema"

您的客户端似乎在连接上设置了 search_path = dbo,这似乎配置错​​误。 dbo 是我们在 SQL 服务器上经常看到的东西(曾经是这里的默认架构还是仍然是?),对于 Postgres 来说非常不典型。不知道你是怎么到那里的。

  • Why do table names in SQL Server start with "dbo"?

另一种方法是将扩展也安装到 dbo 架构中:

  • Best way to install hstore on multiple schemas in a Postgres database?

你甚至可以move (most) extensions to a different schema:

ALTER EXTENSION citext SET SCHEMA dbo;

但我建议安装专用模式的扩展并将其包含在 search_path 中。

无论如何不要管plpgsql。它是默认安装的,应该留在 pg_catalog.

不管怎样,用不同的 search_path 设置清理混乱。


关于第二个问题:这是遵循Function Type Resolution的规则。调用无法解析,因为 citext 没有隐式转换为 text.

相关