我试图在我的数据库上运行一个内联查询-它安装了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 Server上看到的很多东西(这里以前是默认模式还是现在仍然是?),对于Postgres来说很不典型。不知道你是怎么到那里的。
Why do table names in SQL Server start with "dbo"?
另一种方法是在dbo模式中安装扩展:
Best way to install hstore on multiple schemas in a Postgres database?
你甚至可以:

ALTER EXTENSION citext SET SCHEMA dbo;

但我建议将扩展安装到一个专用模式并将其包含在search_path中。
在任何情况下都不要打扰plpgsql。它是默认安装的,应该保持在pg_catalog中。
不管怎样,使用不同的search_path设置来清理混乱。
至于第二个问题:这是以move (most) extensions to a different schema的规则为指导的。无法解析调用,因为citext没有到text的隐式强制转换。
相关的
Function Type Resolution

关于postgresql - 已安装其他模块citext,但是找不到“citext”类型吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39261729/

10-11 03:22