unixODBC/Postgres密码神秘登录错误

问题描述 投票:0回答:2

我用 C++ 编写了一些使用 ODBC 远程操作数据库的软件。在本例中,数据库在 Postgres 引擎中运行,而我的软件在安装了 unixODBC 和 odbc-postgres 驱动程序的 Ubuntu 服务器计算机上运行。

我使用 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 错误,我将其发送到标准输出:

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

(当然,使用

--dsn DSN=myDSN
也会以同样的方式失败)。

此密码正确。如果我使用所有三个命令行参数进行调用,我可以建立连接并在 isql 中使用它。但是,由于某种原因,在这种环境下,有其他东西阻止我正确地执行此操作。

在此连接的实际密码中,我使用“#”字符。这是唯一一个可能以任何方式引起问题的远程特殊字符。我知道 bash 在命令行上没有做任何奇怪的事情,因为我看到它在我的可执行文件的标准输出中引用,并且我尝试在它前面加上 \ 以确保它能够正确转义,以防 bash 做了一些令人讨厌的事情有了它。

我无法使用 isql 来完成我想做的事情...我可能请求的数据集需要一些 C++(或类似的)爱好。

编辑:

进一步调查,我做了以下事情:

  1. 更改了 .odbc.ini 文件以匹配开发环境。这导致连接成功。所以客户端环境中没有任何问题。
  2. 更改了 .odbc.ini 文件以使用相同的服务器和数据库,但更改了登录名以匹配失败的登录名。然后,我将该角色/密码添加到开发 Postgres 引擎中,以匹配目标 Postgres 引擎上的目标帐户。这个失败了。因此,我认为问题可能涉及密码。

关于从这里去哪里有什么建议吗?

linux postgresql odbc
2个回答
0
投票

最后,我添加了另一个用户,其密码中没有“#”字符,并更改了我的 .odbc.ini 文件以匹配新用户和密码。

连接正确。

也许这个驱动程序有一个错误。


0
投票

一个老问题,但我进行了广泛的搜索,但没有找到适合我的解决方案。

对我有用的是 在 odbc.ini 文件中对密码进行 URL 编码。

© www.soinside.com 2019 - 2024. All rights reserved.