我试图在我的数据库上运行一个内联查询-它安装了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/