Владелец базы данных postgresql не может получить доступ к базе данных - "Никаких отношений не найдено".
У меня есть пользователь: user_x, который владеет базой данных на postgresql и не имеет атрибута ROLE (CREATE_DB, SUPERUSER,...)
Этот user_x может получить доступ ко всей БД, создать таблицы (в его базе данных), выбрать, вставить и обновить данные.
У меня есть этот список баз данных:
mydatabase=> \l
List of databases
Name | Owner | Encoding | Collation | Ctype | Access privileges
-------------------------+----------+-----------+-----------+-------+-----------------------
postgres | postgres | SQL_ASCII | C | C |
mydatabase | user_x | UTF8 | C | C |
template0 | postgres | SQL_ASCII | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | SQL_ASCII | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
whoami | postgres | SQL_ASCII | C | C |
(6 rows)
и следующие роли:
mydatabase=> \du
List of roles
Role name | Attributes | Member of
-----------+-----------------------------------+-----------
postgres | Superuser, Create role, Create DB | {}
user_x | | {}
mydatabase=> \d
List of relations
Schema | Name | Type | Owner
--------+-----------------------------------+----------+----------
public | addresses | table | user_x
public | addresses_id_seq | sequence | user_x
public | assignments | table | user_x
public | assignments_id_seq | sequence | user_x
...
Хорошо, пока я не удалю данные и не восстановит их на другом сервере postgresql.
После импорта данных на другом сервере (с тем же именем базы данных и пользователем) и вошедшим в систему psql ответ команды \d: "Не найдены отношения".
Итак, я добавил роль SUPERUSER в user_x на импортированном сервере базы данных, и tadã user_x снова может видеть отношения и данные.
Но пользователю не нужно иметь привилегии SUPERUSER для доступа к этой базе данных.
Что случилось с этим импортированным дампом?
Кто-нибудь теперь, как это решить?
Ответы
Ответ 1
Возможно, разрешения схемы для схемы public
были искажены. Каков результат \dn+
на обоих сайтах?
Результат должен выглядеть следующим образом:
List of schemas
Name | Owner | Access privileges | Description
--------+----------+----------------------+------------------------
public | postgres | postgres=UC/postgres | standard public schema
: =UC/postgres
(1 row)
Если часть =UC/postgres
отсутствует, вы можете восстановить ее с помощью
grant all on schema public to public;