今天碰到个 PostgreSQL db_link 问题, 问题是这样的,数据库 mapfriends 需要访问数据库skytf 的一张表 test_41, 这两个数据库是在同一台主机上,在创建好了 view 后,查询报错,以下为详细信息。
创建视图
mapfriends库创建视图,如下:
1 |
CREATE OR REPLACE VIEW view_test_41 AS |
备注:上面创建视图完成。
查询视图报错
1 |
mapfriends=> select * From view_test_41; |
备注:刚开始看到这个报错觉得很奇怪,因为在上一步创建 view 语句里已经写了数据库的密码,而这里又提示非超级用户需要输入密码,接着查看 pg_hba.conf 文件,也没发现什么异常。于是google一把没发现啥有用信息,后来直接咨询德哥了,德哥了解了一下情况后,觉得可能是 pg_hba.conf 的配置问题;
查看 pg_hba.conf 文件
1 |
# TYPE DATABASE USER CIDR-ADDRESS METHOD |
备注:这是老的 pg_hba.conf 文件,德哥发现下面这行有问题,即 host all all 127.0.0.1/32 trust
, 建议认证方式改为 md5 试下。
修改后的 pg_hba.conf 文件
1 |
# TYPE DATABASE USER CIDR-ADDRESS METHOD |
这里增加一行 skytf 库的 md5 认证方式, 重新加载 pg_hba.conf 使其生效, 重新加载命令:
1 |
pg_ctl reload -D $PGDATA ) |
再次查询视图
1 |
mapfriends=> select * from view_test_41; |
备注:在修改 pg_hba.conf 文件后,果然可以查询了,看来德哥的思路是正确的,这次学习了。
查询 VIEW 定义
1 |
mapfriends=> select * from pg_views where viewname='view_test_41'; |
备注:上面SQL可以查出视图的定义,包括主机,用户名,密码信息,并且以明文形式,所以 db_link 是一种危险的行为,这很容易暴露生产环境的信息,所以不建议在生产环境上用 db_link。
总结
之前查询视图报错是因为原来的 pg_hba.conf 设置了主机的认证方式为 trust, 而创建 db_link 语法里需要提供密码信息,这一点上是矛盾的,所以抛出之前的错误信息,解决方法只需要在将 trust 改为 md5 ,或者加一条db_link 到目标库 的 md5 认证方式即可。
原创文章,作者:kirin,如若转载,请注明出处:https://blog.ytso.com/236406.html