Postgres:'角色不存在'使用dblink,但确实如此

时间:2013-08-09 16:29:50

标签: postgresql postgresql-9.2 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,id 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

提前致谢!

2 个答案:

答案 0 :(得分:5)

尝试从连接字符串中删除逗号。

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配置是个问题。因为您首先使用'trust'方法,所以将使用它。尝试将'md5'条目放在'trust'条目之前,或删除'trust'条目。 (首先为自己的postgres帐户设置密码,这样一旦需要密码,您仍然可以进行身份​​验证。)

第二个问题的原因是,如果为您连接的主机名启用了“trust”,它将在不需要密码的情况下对用户进行身份验证,并且由于非超级用户无法在没有密码的情况下进行连接,因此会失败连接。

最后,必须使用密码对运行调用dblink的查询的用户进行身份验证。因此,如果您使用“信任”身份验证连接到数据库,然后运行dblink,您也会收到错误。要解决此问题,请更改为md5身份验证并使用密码进行连接。

答案 1 :(得分:2)

您在连接字符串中使用逗号。错误消息显示:

FATAL: role "my_user," does not exist

这表示此情况下的确切错误。这是not the way do do it。您应该只在空格中分隔连接字符串中的项目,如:

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)