【问题标题】:Additional module citext is installed, but type "citext" not found?安装了附加模块 citext,但找不到类型“citext”?
【发布时间】:2023-03-31 10:22:01
【问题描述】:

我正在尝试在我的数据库上运行内联查询 - 已安装 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

【问题讨论】:

  • citext ... is part of the schema - 属于哪个模式?运行:SELECT e.extname, n.nspname FROM pg_extension e JOIN pg_namespace n ON n.oid = e.extnamespace; 你会从show search_path 得到什么?
  • 更新了问题以反映该信息。有趣的是,我似乎也遇到了这个问题,试图在内联查询中使用 uuid_generate_v4()。
  • 哦,伙计.. 这可能特定于 DataGrip 2016 及其启动连接的方式。我尝试使用 pgAdmin 进行相同的查询,并且 search_path 包含扩展名,而 DataGrip 中没有。
  • 不相关但是:你应该避免使用带引号的标识符。他们的麻烦比他们值得的要麻烦得多。
  • 所以怀疑。我为我的答案添加了更多指针。

标签: postgresql postgresql-9.3 search-path postgresql-extensions


【解决方案1】:

正如怀疑的那样,search_path 中缺少扩展架构。在此相关答案中阅读如何设置架构搜索路径:

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

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

你甚至可以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

相关

【讨论】:

    猜你喜欢
    • 2013-04-05
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 2016-07-05
    相关资源
    最近更新 更多