Назад | Перейти на главную страницу

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)

в отличие 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);