在 Postgres 中授予用户执行功能

Qki*_*kiZ 0 postgresql permissions

https://www.postgresql.org/docs/9.1/sql-grant.html 的文档中,有一个 GRANT 命令的语法。

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    ON { FUNCTION function_name ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) [, ...]
         | ALL FUNCTIONS IN SCHEMA schema_name [, ...] }
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
Run Code Online (Sandbox Code Playgroud)

我尝试使用此语法向某些函数添加执行权限,但没有成功:

db=# GRANT EXECUTE ON FUNCTION some_function TO some_user;
ERROR:  syntax error at or near "TO"
LINE 1: GRANT EXECUTE ON FUNCTION some_function TO some_user...
Run Code Online (Sandbox Code Playgroud)

为什么文档和现实之间有如此紧密的联系?我做错了什么?

Qki*_*kiZ 5

之后的括号中缺少“参数数据类型” function_name。我们可以通过\df命令检查函数名称和参数数据类型。

 Schema |        Name        | Result data type          |Argument data types |  Type  
--------+--------------------+---------------------------+--------------------+--------
 public | some_function      | TABLE(some_results,....)  | numeric            | normal
Run Code Online (Sandbox Code Playgroud)

命令应该是:

GRANT EXECUTE ON FUNCTION some_function(numeric) TO some_user;
Run Code Online (Sandbox Code Playgroud)

但是语法在方括号中包含参数,因此它们应该不是必需的。但是尝试

GRANT EXECUTE ON FUNCTION some_function() TO some_user;
Run Code Online (Sandbox Code Playgroud)

给出function some_function() does not exist错误。所以 GRANT 命令的语法应该是:

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    ON { FUNCTION function_name ( argmode arg_name arg_type [, ...] ] ) [, ...]
         | ALL FUNCTIONS IN SCHEMA schema_name [, ...] }
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
Run Code Online (Sandbox Code Playgroud)