3

使用 PostgreSQL 9.6

我使用 postgres 用户使用创建扩展 pgcrypto 启用了 pgcrypto。现在我想向我的其他数据库用户授予执行权限。不幸的是我做不到。这是可能的还是您必须是超级用户才能使用 pgcrypto 的摘要功能。

postgres=# GRANT EXECUTE ON FUNCTION digest TO another_user;
ERROR:  syntax error at or near "digest"
LINE 1: GRANT EXECUTE ON FUNCTION digest TO another_user;

使用下面的答案,我能够成功授予执行该功能的权限。但是 another_user 无法执行该功能。为了使用另一个用户执行此功能,我还需要其他权限吗?

another_user=> SELECT digest('whatisgoingon'::text, 'sha256'::text);
ERROR:  function digest(text, text) does not exist
LINE 1: SELECT digest('whatisgoingon'::text, 'sha256'::text);
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

即使当我检查用户的权限时,我也会返回我拥有权限。

postgres=# select has_function_privilege('another_user', 'digest(text, text)', 'execute');
 has_function_privilege 
------------------------
 t
(1 row)

谢谢

4

1 回答 1

3

Postgres 支持重载,即多个具有相同名称但参数列表不同的函数。

在 SQL 中调用该函数时,它会根据参数的数量及其类型确定您所指的版本。但是,当在 DDL 命令(DROPALTERGRANT等)中引用函数时,您需要通过在函数名称后包含参数类型列表来准确指定您所指的版本。

这在 的情况下是非常相关的digest,因为实际上有两个版本,并且您需要弄清楚您在说哪个版本。所以要么:

GRANT EXECUTE ON FUNCTION digest(text,text) TO another_user

...或者:

GRANT EXECUTE ON FUNCTION digest(bytea,text) TO another_user

(...或两者。)


从 Postgres 10 开始,您可以在函数未重载时省略参数列表。在 的情况下,这对您没有多大帮助digest,但至少您会收到一条信息更丰富的错误消息:

postgres=# GRANT EXECUTE ON FUNCTION digest TO another_user;
ERROR:  function name "digest" is not unique
HINT:  Specify the argument list to select the function unambiguously.

至于您关于错误的后续问题function does not exist,请尝试对函数名称进行模式限定,例如SELECT my_schema.digest(...).

  • 如果可行,那就是搜索路径问题。您可以使用显式模式名称继续调用它,或者更新您的search_path.

  • 如果它以 响应ERROR: permission denied for schema my_schema,那么您只需要GRANT USAGE ON SCHEMA my_schema TO another_user.

  • 如果它仍然显示function my_schema.digest(text, text) does not exist,那么您可能错误地连接到了错误的数据库。

于 2018-02-06T10:29:57.967 回答