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