このエントリは2022/12/28現在の情報に基づいています。将来の機能追加や変更に伴い、記載内容との乖離が発生する可能性があります。
何を調べようとしているか?
Azure Database for PostgreSQL Flexible Serverの同一ノード上の別データベースをPostgreSQLのdblinkを使ってクエリする場合、ホスト名はlocalhostでよいのか、Flexible ServerのFQDNを使うべきなのか
データベース間の関係が密になるためあまり好ましくないのだが、機能確認することにした。dblinkについては以下を参照。
dblink
https://www.postgresql.org/docs/current/contrib-dblink-function.html
FQDNを指定したTCP接続でアクセスできるのは当然だが、localhostを使ったローカルソケットでの接続が可能なのか確認する。
準備
まずは、Flexible Serverで拡張機能を有効にする。手順は以下のドキュメントにある。
Azure Database for PostgreSQL – フレキシブル サーバーの PostgreSQL 拡張機能 / PostgreSQL extensions in Azure Database for PostgreSQL – Flexible Server
https://learn.microsoft.com/azure/postgresql/flexible-server/concepts-extensions

この記事では、事前に作成されているpostgresと、新規作成したdb1というデータベースを使う。拡張機能をノードに対してデプロイしたら、呼び出し元のデータベースで拡張を作成しておく。今回は別の検証で使うために両方から呼び出せるよう、両データベースに対して実行している。
db1=> create extension dblink;
CREATE EXTENSION
postgres=> create extension dblink;
CREATE EXTENSION
db1というデータベースでは、簡単な表を作成しておく。
db1=> select * from tbl1;
id | name
----+-------
1 | Test1
2 | Test2
(2 rows)
postgresにも簡単な表を作成しておく。
postgres=> select * from tbl2;
id | comments
----+-----------
1 | こめんと1
2 | こめんと2
(2 rows)
テスト
事前に作成されているpostgresというデータベースから試す。FQDNでの接続は当然ながらできる(というか、できないと困る)。
postgres=> select
t1.id, t1.name, tbl2.comments
from
dblink('host=FQDN port=5432 dbname=db1 user=db1_user password=db1_password')
as t1(id integer, name varchar(10)),
tbl2
where
tbl2.id = t1.id;
id | name | comments
----+-------+-----------
1 | Test1 | こめんと1
2 | Test2 | こめんと2
(2 rows)
で、localhostでも試す。
postgres=> select
t1.id, t1.name, tbl2.comments
from
dblink('host=localhost port=5432 dbname=db1 user=db1_user password=db1_password')
as t1(id integer, name varchar(10)),
tbl2
where
tbl2.id = t1.id;
id | name | comments
----+-------+-----------
1 | Test1 | こめんと1
2 | Test2 | こめんと2
(2 rows)
想定通り両方法で可能だった。何れの方法もサポートはされるので、localhostではだめ、ということはない。
じゃあどちらを選ぶ?
FQDNでなければならない、ということはないようなので、お好みで何れかを使うことで問題なさそう。個人的にはlocalhostを使いそう。