来自文档:
只有超级用户可以使用dblink_connect创建非密码身份验证连接。如果非超级用户需要此功能,请改用dblink_connect_u。
以及
dblink_connect_u()与dblink_connect()相同,不同之处在于它允许非超级用户使用任何身份验证方法进行连接。
这意味着您的dblink
调用隐式地使用dblink_connect
。请改为使用dblink_connect_u
或更改您的身份验证方法,例如MD5。
请注意,您还需要向caixa
角色授予执行权限,例如:
GRANT EXECUTE ON FUNCTION dblink_connect_u(text) TO caixa;
GRANT EXECUTE ON FUNCTION dblink_connect_u(text, text) TO caixa;
示例(在GRANT
之后):
meta=> SELECT dblink_connect_u('conn1', 'dbname=op');
meta=> SELECT * FROM dblink('conn1','SELECT op_col from op_table')
AS t(op_col varchar);
op_col
aaa
bbb
ccc
(3 rows)
meta=> SELECT dblink_disconnect('conn1');
编辑:
抱歉之前回答有些误导。当然你不需要使用dblink_connect_u
进行md5身份验证的连接。我发现PostgreSQL有两种不同的连接类型: 主机和本地。
运行:
psql -h localhost ..
采用的是主机连接,但是
dblink_connect('mycon','dbname=vchitta_op user=caixa password=caixa');
使用的是本地类型,所以如果你有非密码方法的本地连接(例如ident方法或信任),那么它会返回
ERROR: password is required
DETAIL: Non-superuser cannot connect if the server does not request a password.
HINT: Target server's authentication method must be changed.
检查
dblink_connect('mycon','hostaddr=127.0.0.1 dbname=vchitta_op user=caixa password=caixa')
用于主机连接。如果可能,请发布您的pg_hba.conf
以获得更清晰的说明。
我还检查了对vchitta_op
数据库的CONNECT
权限,但错误消息不同:
REVOKE CONNECT ON DATABASE vchitta_op FROM PUBLIC;
REVOKE CONNECT ON DATABASE vchitta_op FROM caixa;
SELECT dblink_connect('mycon','dbname=vchitta_op user=caixa password=caixa');
ERROR: could not establish connection
DETAIL: FATAL: permission denied for database "vchitta_op"
DETAIL: User does not have CONNECT privilege.
select dblink_connect('mycon','dbname=vchitta_op user=caixa password=yourpass');
。此外,如果您已经有md5,则不需要整个dblink_connect_u
方法。 - Grzegorz Szpetkowskivchitta_meta=> select dblink_connect('mycon','dbname=vchitta_op user=caixa password=caixa'); ERROR: password is required <b>DETAIL: 如果服务器不要求密码,则非超级用户无法连接。<b> HINT: 必须更改目标服务器的身份验证方法。
- vchittadblink_connect_u
的权限,但实际上调用了dblink_connect
- 这是两个不同的函数。 - vol7ron