使用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命令中引用该函数(DROP
,ALTER
,GRANT
等(时,您需要确切地指定您含义哪个版本,通过在函数名称之后包含参数类型的列表。
在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
,那么您可能会错误地连接到错误的数据库。