如何向用户授予执行 pgcrypto 摘要功能

how to grant execute to pgcrypto digest function to user

使用 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 执行此功能?

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)

谢谢

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

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

这在digest的情况下是很相关的,因为实际上有two versions,你需要弄清楚你说的是哪一个。所以要么:

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,那么您可能错误地连接到了错误的数据库。