SQL Server 2012:向PostgreSQL添加链接服务器

时间:2013-08-01 16:11:18

标签: sql sql-server postgresql sql-server-2012 linked-server

我尝试将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服务器的日志中找到了相同的错误信息。

有人有解决此问题的想法吗?

提前致谢。

杰罗姆

[2013年2月2日更新] 我完成这篇文章的结果是我今天发现的测试结果。

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

2系统之间的数据相同:

  • 打开与PostgreSQL的连接

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

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

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

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

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

对于SMSS,我收到一条错误消息(如上图所示)。

2 个答案:

答案 0 :(得分:7)

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

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

条目现在是:

Type Database User Address   Method

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

希望能帮助别人。

答案 1 :(得分:1)

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

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

{password}

如果您的用户密码中包含某些符号,这将防止ODBC连接字符串被弄乱。