Postgres: «роль не существует» с использованием dblink, но она существует

Так что это очень странно. Я пытаюсь сделать простой выбор, используя dblink как таковой:

SELECT * FROM dblink('dbname=my_db_name, user=my_user, password=password, hostaddr=127.0.0.1', 'SELECT action, object, created_at, id FROM my_table') AS de(ACTION VARCHAR, OBJECT VARCHAR, created_at TIMESTAMP, идентификатор INT)

И я сразу же получаю сообщение об ошибке:

PG:: SqlclientUnableToEstablishSqlconnection: ОШИБКА: не удалось

установить соединение DETAIL: FATAL: роль "my_user" не существует

Но если я подключусь к psql локально и распечатаю список пользователей, используя \du, вы увидите, что он указан:

                               List of roles
   Role name   |                   Attributes                   | Member of 
---------------+------------------------------------------------+-----------
 MyName        | Superuser, Create role, Create DB, Replication | {}
 my_user       | Create DB                                      | {}

Я действительно в недоумении, как это исправить, гугление мне тоже не очень помогло. Любые мысли о том, почему он дает мне это сообщение об ошибке?

Когда я подключаюсь, используя свою учетную запись суперпользователя, мне не нужно указывать пароль, и dblink работает нормально, поэтому я совершенно сбит с толку. Вот файл pg_hba.conf:

local   all             all                                     trust
local   all             all                                     md5

host    all             all             192.168.33.1/24         trust

# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
host    all             all             127.0.0.1/32            md5

# IPv6 local connections:
host    all             all             ::1/128                 trust
host    all             all             ::1/128                 md5

Заранее спасибо!


person Geesu    schedule 09.08.2013    source источник
comment
Возможно, my_user был создан с предшествующим/последующим пробелом? Виден ли пробел в выводе select '>'||rolname||'<' from pg_roles;?   -  person bma    schedule 09.08.2013


Ответы (2)


Попробуйте удалить запятые из строки подключения.

SELECT * FROM dblink('dbname=my_db_name  user=my_user password=password hostaddr=127.0.0.1', 'SELECT action, object, created_at, id FROM my_table') AS de(ACTION VARCHAR, OBJECT VARCHAR, created_at TIMESTAMP, id INT)

Это должно решить проблему, когда он пытается аутентифицироваться как my_user,.

Во-вторых, проблема с вашей конфигурацией pg_hba. Поскольку сначала у вас есть метод «доверия», он будет использоваться. Либо попробуйте поместить записи «md5» перед записями «доверие», либо удалите записи «доверие». (Сначала установите пароль для своей собственной учетной записи postgres, чтобы вы могли пройти аутентификацию, когда пароли потребуются.)

Причина второй проблемы заключается в том, что если «доверие» включено для имени хоста, с которого вы подключены, он будет аутентифицировать пользователя без запроса пароля, а поскольку пользователи, не являющиеся суперпользователями, не могут подключиться без пароля, он не сможет подключиться.

Наконец, пользователь, выполняющий запрос, вызывающий dblink, должен пройти аутентификацию с использованием пароля. Поэтому, если вы используете «доверительную» аутентификацию для подключения к базе данных, а затем запустите dblink, вы также получите сообщение об ошибке. Чтобы это исправить, измените аутентификацию на md5 и подключитесь с помощью пароля.

person Robin Daugherty    schedule 09.08.2013

Вы используете запятые в строке подключения. В сообщении об ошибке говорится:

FATAL: role "my_user," does not exist

Что указывает на точную ошибку в данном случае. Это не так. Вы должны только разделять элементы в строке подключения, например:

SELECT * FROM dblink('dbname=my_db_name user=my_user password=password hostaddr=127.0.0.1', 'SELECT action, object, created_at, id FROM my_table') AS de(ACTION VARCHAR, OBJECT VARCHAR, created_at TIMESTAMP, id INT)
person Petesh    schedule 09.08.2013