postgresql - SQL 状态 : 42883, 没有函数匹配给定的名称和参数类型。但是这个功能确实存在

标签 postgresql function casting search-path

我有一个带有 PostgreSQL 8.1.23 的服务器,当它与 postgres 用户一起运行时,其功能可以完美运行,但与另一个用户一起运行时显示 SQL STATE:

SQL state: 42883

这是我的功能:

CREATE OR REPLACE FUNCTION fun_validatepost(integer, integer)
  RETURNS integer AS
$BODY$
...
$BODY$
LANGUAGE plpgsql VOLATILE;
ALTER FUNCTION fun_validatepost(integer, integer)
  OWNER TO postgres;
GRANT EXECUTE ON FUNCTION fun_validatepost(integer, integer) TO public;
GRANT EXECUTE ON FUNCTION fun_validatepost(integer, integer) TO postgres;
GRANT EXECUTE ON FUNCTION fun_validatepost(integer, integer) TO someuser;

如果我像这样使用 postgres 用户运行它:

select fun_validatepost(1,230465);

结果是这样的:

-[ RECORD 1 ]-----------+--
fun_validatepost        | 1

但是如果我执行与某个用户相同的查询,则会显示此消息:

ERROR:  function fun_validatepost(integer, integer) does not exist
SQL state: 42883
HINT:  No function matches the given name and argument types. You may need to add explicit type casts

即使进行显式转换,我也会得到相同的结果:

select fun_validatepost from fun_validatepost(1::integer,230465::integer);

同样的错误信息。

我该怎么做才能让 someuser 可以执行相同的功能?
我的函数或转换有问题吗?

最佳答案

很可能是架构与架构 search_path 的问题。该函数是在创建用户的默认架构中创建的。如果它不在当前用户的 search_path 中,则它不可见。

详细信息:

通常,您会在 public 模式中创建公共(public)函数,并在每个人的 search_path 中拥有该模式。

CREATE OR REPLACE FUNCTION <b>public.</b>fun_validatepost(integer, integer)
  RETURNS integer AS
$BODY$
...
$BODY$ LANGUAGE plpgsql;
ALTER FUNCTION public.fun_validatepost(integer, integer) OWNER TO postgres;

仅当 public 不是默认模式时才需要模式限定。

此外,您的 GRANT 命令毫无意义。默认情况下,函数的 EXECUTE 权限授予 public。一旦您授权给public,就没有必要再授权给其他用户了。尤其是 postgres,它无论如何都是 OWNER 并且也是 super 用户。 The manual:

PostgreSQL grants default privileges on some types of objects to PUBLIC. [...] EXECUTE privilege for functions;

您确实需要在创建函数的SCHEMA 上授予USAGEpublic 架构默认将 USAGE 授予 public(所有人)。

一边 1

转换为 integer 在这里不会改变任何东西,因为没有小数点的数字文字会自动强制转换为整数。 Details about constants in the manual.

一边 2

Urgently consider updating to a current version of Postgres. Your software is completely outdated.

关于postgresql - SQL 状态 : 42883, 没有函数匹配给定的名称和参数类型。但是这个功能确实存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40370117/

相关文章:

mysql - 根据列值连接多个表

r - 努力创建差异函数

sql - 在SQL中将INT转换为FLOAT

sql-server - SQL Server 中 To_Char 和 T_Number 交替进行格式化

c++将部分数组(在某个偏移量处)转换为不同的类型

postgresql - 如何设置postgres主键固定长度

c# - 如何创建大小均匀的组

ruby-on-rails - 在 OpenSUSE 中安装 PG gem

mysql - 如何在 MySQL 函数中引发错误

c# - 我应该在 .NET 项目中的什么地方放置杂项函数?