PostgreSQL dblink

XEAD Editor、XEAD Driverを使って開発が進むようになると
レガシーシステムから新システムへのデータ移行
異なるPostgreSQLのデータベース間でのデータ移行を頻繁に行う必要が出てくる。

MySQLであれば、データベース名で修飾するだけで異なるデータベースにアクセスできる。


PostgreSQLでは、dblinkを利用する方法がある。

Let's Postgresで紹介されているが、Windows版での利用注意点を記録する。

http://lets.postgresql.jp/documents/technical/contrib/dblink/


ローカルデータベース(local)とリモートデータベース(remote)での確認作業が必要である。

PostgreSQL 9.2.3 Windows版での実行例

1.(local)へPgAdminIIIで接続し、次のSQLを実行する

CREATE EXTENSION dblink;

データベースツリーのExtensionsにdblinkが追加されることで確認。

2.Let's Postgresの記事を参考に次の2関数を追加する
get_columndef(regclass)
insert_from_remote(insert_into regclass, conninfo text, remote_query text, num_fetch integer)

3.(remote)の複写したいテーブルのcreate文をPgAdminIIIで取得、(local)で実行して同じテーブルを作成する。

4.ローカルホスト内で(remote)のtbl商品台帳を(local)にコピーすると仮定して
(local)へPgAdminIIIで接続し、次のSQLを実行する
SELECT insert_from_remote('tbl商品台帳','host=localhost port=5432 dbname=remote user=postgres password=hogehoge', 'SELECT * FROM tbl商品台帳', 1000);

第2引数は、環境にあわせ書き変える。

第2引数の例がヒットしなかったので次のエラーでつまづいた。

ERROR: could not establish connection
SQLステート:08001
コンテキスト:SQL文 "SELECT dblink_connect('copy_conn', conninfo)"
PL/pgSQL function insert_from_remote(regclass,text,text,integer) line 11 at PERFORM

dblinkを導入しなければならないのは(local)側のデータベースのみです。