如何授予非超级用户执行函数 pg_read_binary_file 的权限?

use*_*760 6 security postgresql privileges

在 PostgreSQL 中,我有一个带有自定义函数的数据库,该函数使用系统函数在数据库表中加载文件的二进制内容pg_read_binary_file

如果我在具有超级用户权限的用户下运行此自定义函数,它将成功执行。但是当用户没有超级用户权限时,我收到错误:

permission denied for function pg_read_binary_file
Run Code Online (Sandbox Code Playgroud)

我认为我所需要的只是为此类用户GRANT授予该功能的权限EXECUTE,因此我执行了以下操作:

GRANT EXECUTE ON FUNCTION pg_read_binary_file(text,bigint,bigint,boolean) TO someuser;
GRANT EXECUTE ON FUNCTION pg_read_binary_file(text,bigint,bigint) TO someuser; 
GRANT EXECUTE ON FUNCTION pg_read_binary_file(text) TO someuser;
Run Code Online (Sandbox Code Playgroud)

如果我检查权限

SELECT proacl FROM pg_proc WHERE proname='pg_read_binary_file';
Run Code Online (Sandbox Code Playgroud)

我得到:

{postgres=X/postgres,someuser=X/postgres}
{postgres=X/postgres,someuser=X/postgres}
{postgres=X/postgres,someuser=X/postgres}
Run Code Online (Sandbox Code Playgroud)

据我了解,现在someuser有权执行该函数pg_read_binary_file。但是当我尝试运行自定义函数时,我仍然收到相同的错误:

permission denied for function pg_read_binary_file
Run Code Online (Sandbox Code Playgroud)

那么问题是如何授予非超级用户执行该函数的权限pg_read_binary_file?也许还有一些必须授予的额外权限,但这并不明显。

Portgres 系统功能的文档pg_read_binary_file写道:

默认情况下仅限超级用户,但可以授予其他用户EXECUTE运行该功能。

我搜索了一些有关如何授予此类权限的其他信息,但没有运气。

Lau*_*lbe 4

有以下三种可能:

  1. 您正在使用旧的 PostgreSQL 版本。

    在提交 e79350fef2917522571add750e3e21af293b50fe之前,这不受函数权限的控制,而是由函数本身的硬编​​码检查控制。

    然而,这似乎不是你的情况,因为错误消息将显示:

    ERROR:  must be superuser to read files
    
    Run Code Online (Sandbox Code Playgroud)
  2. someuser当您尝试执行该函数时,您却没有。测试用

    SELECT current_user;
    
    Run Code Online (Sandbox Code Playgroud)
  3. 您已连接到不同的数据库(例如,您更改了数据库中的权限postgres,但someuser连接到了不同的数据库)。