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_largeobject
,pg_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);