unixODBC / Postgres пароль загадочная ошибка входа - PullRequest
0 голосов
/ 19 сентября 2018

Я написал несколько программ на C ++, которые используют ODBC для удаленной работы с базой данных.В этом случае база данных работает в движке Postgres, а мое программное обеспечение работает на сервере с Ubuntu с установленным unixODBC и драйвером odbc-postgres.

Я использовал odbcinst с правильным файлом шаблона для генерации моегоФайл .odbc.ini.Я знаю, что это правильно, потому что я использовал его для подключения к другой базе данных Postgres на другом сервере с другой комбинацией имени пользователя и пароля.«Работает на моей машине разработки», как говорится:

На этой целевой машине я изменил сервер, имя пользователя и пароль, чтобы они соответствовали тому, где я хочу, чтобы он подключился.

Итакв командной строке bash я проверяю с помощью:

$ isql -v myDSN

Это дает:

[28000][unixODBC]FATAL:  password authentication failed for user "myUser"
[ISQL]ERROR: Could not SQLConnect

Э-э, хорошо, давайте попробуем это:

$ isql -v myDSN myUser myPassword

Это дает:

+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL>

Neato, но довольно загадочно, когда «myPassword» буквально вырезан и вставлен, чтобы убедиться, что он такой же.

ХорошоТаким образом, возможно, в моем двоичном файле вместо использования «DSN = myDSN» для строки подключения, передаваемой в командную строку, я могу использовать:

$ my_bin --myArgs --dsn Driver={PostgreSQL\ Unicode}\;Servername=myServer\;Database=myDatabase\;UID=myUser\;PWD=myPassword

Но это приводит к ошибке ODBC, которую я отправляюstdout:

[unixODBC]FATAL:  password authentication failed for user "myUser"

(Конечно, использование --dsn DSN=myDSN тоже не удается точно так же).

Этот пароль правильный.Я могу установить соединение и работать с ним в isql, если я вызываю все три аргумента командной строки.Но по какой-то причине в этой среде что-то еще мешает мне сделать это правильно.

В фактическом пароле для этого соединения я использую символ «#».Это единственный отдаленно специфический персонаж, который может каким-либо образом вызвать проблемы.Я знаю, что bash не делает ничего странного с ним в командной строке, потому что я вижу, что он указан в stdout из моего исполняемого файла, и я попытался добавить его к \, чтобы убедиться, что он был экранирован правильно в случае, если bash делал что-то нехорошеес ним.

Я не могу использовать isql для того, что я хочу сделать ... набор данных, который я могу запросить, нуждается в некоторой любви к С ++ (или подобному).

Редактировать:

Исследуя еще кое-что, я сделал следующее:

  1. Изменен файл .odbc.ini, чтобы он соответствовал среде разработчика.Это привело к успешной связи.Поэтому в клиентской среде нет ничего неправильного.
  2. Изменил файл .odbc.ini для использования того же сервера и базы данных, но изменил имя входа, чтобы оно соответствовало ошибочному.Затем я добавил эту роль / пароль в движок разработчика Postgres, соответствующий целевой учетной записи на целевом движке Postgres.Этот терпит неудачу.Следовательно, я думаю, что проблема может быть связана с паролем.

Любые предложения о том, куда идти дальше?

1 Ответ

0 голосов
/ 19 сентября 2018

В конце я добавил другого пользователя с паролем, в котором нет символа «#», и изменил мой файл .odbc.ini, чтобы он соответствовал новому пользователю и паролю.

Этоподключен правильно.

Возможно, в этом драйвере есть ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...