在文档中https://www.postgresql.org/docs/9.1/sql-grant.htmlGRANT 命令有一个语法。
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 ]
我尝试使用此语法为某些函数添加执行权限,但没有成功:
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...
为什么记录和现实如此吻合?我做错了什么?
答案1
后面括号里缺少“参数数据类型” function_name
。函数名和参数数据类型我们可以通过\df
命令来检查。
Schema | Name | Result data type |Argument data types | Type
--------+--------------------+---------------------------+--------------------+--------
public | some_function | TABLE(some_results,....) | numeric | normal
命令应该是:
GRANT EXECUTE ON FUNCTION some_function(numeric) TO some_user;
但是语法中有方括号内的参数,所以它们应该不是必需的。但是尝试
GRANT EXECUTE ON FUNCTION some_function() TO some_user;
给出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 ]
答案2
请尝试一下。以下示例是我如何向 efm 用户授予 pg_current_wal_lsn() 系统函数的执行权限。
postgres=# 授予 efm 在函数 pg_current_wal_lsn() 上执行的权限;
授予
如何查看此功能授予的访问权限?
postgres=# \x
扩展显示已打开。
postgres=#
postgres =#\ df + pg_current_wal_lsn();
函数列表 -[记录 1]-------+----------------------------- 模式 | pg_catalog 名称 | pg_current_wal_lsn 结果数据类型 | pg_lsn 参数数据类型 | 类型 | func 挥发性 | 挥发性 并行 | 安全 所有者 | kali 安全性 | 调用者 访问权限 | =X/kali + | kali=X/kali + | efm=X/kali 语言 | 内部 源代码 | pg_current_wal_lsn 描述 | 当前 wal 写入位置