9

我尝试将 PostgreSQL 连接到 SQL Server 2012 服务器作为链接服务器

我在不同的论坛上找到了一些建议并遵循它。但我遇到了身份验证问题。

我解释:

在 SQL Server 上,我已经安装了 PostgreSQL 的 ODBC 驱动程序(psqlodbc_09_02_0100-x64)。我为 PostgreSQL 上的特定数据库创建了一个系统 DSN。此 DSN 工作正常。

使用 SSMS,我运行以下命令来添加链接服务器:

EXEC master.dbo.sp_addlinkedserver 
@server = N'lnk_test', 
@srvproduct=N'PostgreSQL Unicode(x64)', 
@provider=N'MSDASQL', 
@provstr=N'Driver=PostgreSQL Unicode(x64);uid=postgres;Server=test1;database=accueil;pwd=MyPassword;SSLmode=disable;PORT=5432'

EXEC master.dbo.sp_addlinkedsrvlogin 
@rmtsrvname=N'lnk_test',
@useself=N'True',
@locallogin=NULL,
@rmtuser=NULL,
@rmtpassword=NULL

运行后,我有一个名为“lnk_test”的新链接服务器。当我收到以下错误消息时:

Cannot initialize the data source object of OLE DB provider "MSDASQL" for linked server "pgTest1_accueil".
OLE DB provider "MSDASQL" for linked server "pgTest1_accueil" returned message "[Microsoft][ODBC Driver Manager] Driver's SQLSetConnectAttr failed".
OLE DB provider "MSDASQL" for linked server "pgTest1_accueil" returned message "FATAL: authentification par mot de passe échouée pour l'utilisateur  « postgres »". (Microsoft SQL Server, Error: 7303)

错误消息是法语,翻译是:“用户“postgres”的密码验证失败。我在PostgreSQL服务器的日志中发现了相同的错误消息。

有人有解决这个问题的想法吗?

提前致谢。

杰罗姆

[更新 2/08/2013] 我用我今天意识到的测试结果完成了这篇文章。

当使用数据包嗅探器时,我检查通过 ODBS 数据源管理器(64 位)和 SSMS 下的链接服务器测试连接时发送的数据包。

两个系统之间的数据相同:

  • 打开与 PostgreSQL 的连接

  • 发送连接字符串(所有参数都相同)

  • PostgreSQL 要求输入密码的响应(唯一不同的是盐值,但这是正常的)

  • 密码以相同的方式发送(使用 MD5 加密)

但之后,服务器的响应不同:

对于 ODBC 数据源,一切正常。我收到身份验证并可以发送测试查询。

对于 SSMS,我收到一条错误消息(如上所述)。

4

2 回答 2

7

好的,我找到了解决方案。

在 pg_hba.conf 文件中,我将发送密码的方法从 MD5 更改为 trust。重新加载服务器后,我的链接服务器连接正常。

现在的条目是:

Type Database User Address   Method

host all      all  x.x.x.x/x trust

希望能帮助其他人。

于 2013-08-02T08:25:46.433 回答
2

我想我找到了答案;我仍然收到最新版本的 ODBC 驱动程序和 Postgres 10.x 的错误。

在 Windows ODBC 对话框中测试时,该连接将正常工作,但在 SQL Server 中将失败。为远程用户设置密码时,请将密码放在大括号中。

{password}

如果您的用户密码中有某些符号,这将防止 ODBC 连接字符串被搞砸。

于 2020-09-02T21:23:44.137 回答