Postgres:使用 dblink 的“角色不存在”,但确实存在

Posted

技术标签:

【中文标题】Postgres:使用 dblink 的“角色不存在”,但确实存在【英文标题】:Postgres: 'role does not exist' using dblink, but it does 【发布时间】:2013-08-09 16:29:50 【问题描述】:

所以这很奇怪。我正在尝试使用 dblink 做一个简单的选择:

SELECT * FROM dblink('dbname=my_db_name, user=my_user, password=password, hostaddr=127.0.0.1', 'SELECT 动作, 对象, created_at, id FROM my_table') AS de(ACTION VARCHAR, OBJECT VARCHAR, created_at TIMESTAMP, id INT)

我立即收到以下错误消息:

PG::SqlclientUnableToEstablishSqlconnection: ERROR: could not

建立连接细节:致命:角色“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

提前致谢!

【问题讨论】:

也许“my_user”是用前面/后面的空格创建的? select '>'||rolname||'<' from pg_roles; 的输出中是否有可见的空格? 【参考方案1】:

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

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

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

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

【讨论】:

【参考方案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)

【讨论】:

以上是关于Postgres:使用 dblink 的“角色不存在”,但确实存在的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 dblink_connect 和 dblink_connect_u

可以使用 PostgreSQL 类型来定义 dblink 表吗?

如何在Postgres中为表中的虚拟列创建数据库链接?

DBLink 查询即使在完成后也不会终止

通过postgres_fdw实现跨库访问

通过postgres_fdw实现跨库访问