5

我有一个使用 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

但是,如果我执行与 someuser 相同的查询,则会向我显示以下消息:

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才能执行相同的功能?
我的函数或演员表有问题吗?

4

1 回答 1

5

很可能是 schema 与 schema 的问题search_path。该函数是在创建用户的默认模式中创建的。如果这不在search_path当前用户的范围内,则它不可见。

细节:

通常,您会在架构中创建公共函数,public并将该架构放在everbody 的search_path.

CREATE OR REPLACE FUNCTION public.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,就无需授予其他用户。尤其不是 to postgresOWNER无论如何,它也是超级用户。手册:

PostgreSQL 将某些类型的对象的默认权限授予 PUBLIC. [...]EXECUTE功能特权;

您确实需要授予创建函数USAGE的位置。SCHEMA默认情况下,public模式授予USAGEpublic每个人)。

除了 1

转换为integer这里不会改变任何内容,因为没有小数点的数字文字会自动强制转换为整数。手册中有关常量的详细信息。

除了 2

紧急考虑更新到 Postgres 的当前版本。您的软件完全过时了。

于 2016-11-01T23:49:05.647 回答