代码之家  ›  专栏  ›  技术社区  ›  Dan

如何将execute to pgcrypto digest函数授予用户

  •  3
  • Dan  · 技术社区  · 8 年前

    使用postgresql 9.6

    我使用postgres用户使用创建扩展pgcrypto启用了pgcrypto。 现在我想将执行权限授予我的另一个db用户。不幸的是,我无法做到这一点。这是否可能,或者您必须是超级用户才能使用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;
    

    使用下面的答案,我能够成功地授予执行该函数的权限。但是,另一个\u用户无法执行该功能。我是否需要其他权限才能使用其他\u用户执行此功能?

    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)
    

    谢谢

    1 回复  |  直到 8 年前
        1
  •  3
  •   Nick Barnes    8 年前

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

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

    这与 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开始,当函数没有重载时,可以省略参数列表。在以下情况下,这对您没有多大帮助 消化 ,但至少您会收到一条信息更丰富的错误消息:

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