如何授予对用户的pgcrypto Digest函数执行



使用postgresql 9.6

i使用Postgres用户使用Create 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;

使用以下答案,我能够成功授予执行该功能的权限。但是,另一个_user无法执行该函数。我还需要其他权限才能使用另一个_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支持过载,即具有相同名称但不同参数列表的多个功能。

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

相关内容

  • 没有找到相关文章

最新更新