SQL 状态:42883,没有函数匹配给定的名称和参数类型。但是这个功能确实存在
SQL state: 42883, No function matches the given name and argument types. But that function actually exists
我有一台带有 PostgreSQL 8.1.23 的服务器,当它 运行 与 postgres
用户一起使用时,该功能可以完美运行,但与另一个用户一起显示 SQL 状态:
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
中,则它不可见。
详情:
- How does the search_path influence identifier resolution and the "current schema"
通常,您会在架构 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
和超级用户。 The manual:
PostgreSQL grants default privileges on some types of objects to
PUBLIC
. [...] EXECUTE
privilege for functions;
您确实需要在创建函数的 SCHEMA
上授予 USAGE
。 public
架构默认将 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 8.1.23 的服务器,当它 运行 与 postgres
用户一起使用时,该功能可以完美运行,但与另一个用户一起显示 SQL 状态:
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
中,则它不可见。
详情:
- How does the search_path influence identifier resolution and the "current schema"
通常,您会在架构 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
和超级用户。 The manual:
PostgreSQL grants default privileges on some types of objects to
PUBLIC
. [...]EXECUTE
privilege for functions;
您确实需要在创建函数的 SCHEMA
上授予 USAGE
。 public
架构默认将 USAGE
授予 public
(所有人)。
强制转换为 integer
在这里不会改变任何东西,因为没有小数点的数字文字会自动强制转换为整数。 Details about constants in the manual.
Urgently consider updating to a current version of Postgres. Your software is completely outdated.