При выполнении 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);