Postgres:pg_dump 报告大对象 xxxxx 的权限被拒绝,但找不到它

Postgres:pg_dump 报告大对象 xxxxx 的权限被拒绝,但找不到它

pg_dump当以只读用户身份执行时readonly,报错:

pg_dump: could not open large object 19536: ERROR:  permission denied for large object 19536

然后我以超级用户身份连接postgres,但是SELECT * FROM pg_largeobject什么都没有返回。

当我跑步时SELECT * FROM pg_largeobject_metadata WHERE oid=19536,我得到

lomowner    lomacl
10  

然后SELECT rolname FROM pg_roles WHERE oid=10;我得到了postgres我(也是超级用户)。

我如何才能找到这个大对象并授予SELECT用户任何读取权限readonly以便它可以执行 pg_dump?

版本:11.4(Ubuntu 11.4-1.pgdg18.04+1)

答案1

不同于pg_largeobjectpg_largeobject_metadata可以被所有用户读取,并且每个大对象占一行。

尝试:

SELECT * FROM pg_largeobject_metadata WHERE oid = 19536;

lomowner列保存大对象所有者的 OID。如果使用的帐户pg_dump不是超级用户,也不是大对象的所有者,并且没有被授予权限,则打开它失败是意料之中的事。


然后我以超级用户 postgres 的身份连接,但 SELECT * FROM pg_largeobject 没有返回任何内容。

尽管有大对象,但 pg_largeobject 中没有行 pg_largeobject_metadata可能没有行,如果大对象都是空的(它们的大小为 0 字节)。

可以使用以下命令单独授予大对象的权限:

 GRANT SELECT ON LARGE OBJECT 19536 TO readonly;

我认为没有任何方法可以向所有大型对象授予权限,但是超级用户可以使用以下命令完全消除对数据库的权限检查:

 ALTER DATABASE test SET lo_compat_privileges TO on;

最后,如果你不需要那个空的大对象,可以用 SQL 将其删除

SELECT lo_unlink(19536);

相关内容