postgres-dblinkでは
接続中のPostgreSQLで他のPostgreSQLデータベースのデータにアクセスする為のライブラリ
contribで提供されているdblinkを利用します
postgres-dblinkインストール
postgresのsrcディレクトリ内のcontrib/dblinkへ移動
su postgres
make
make install
$ psql -U postgres -d {DBNAME} < dblink.sql
※{DBNAME}はdblinkを利用したいデータベース名。
これをtemplate1とすることで今後作成するデータベースで利用できるようになる。
● 使用方法
“[" と "]” で括られている接続識別名は省略可能です。
ただし接続識別名を接続時に指定した場合は常に必要です。※ “[" および "]” は記述不要。
* アクセスしたいテーブルなどがあるデータベースに接続
select dblink_connect(['{接続識別名}', ]‘{接続文字列}’);
※ {接続文字列}にはlibpqのPQconnectdb関数で利用するキーワードを記述します。
参照.) PostgreSQLマニュアル – libpq – Cライブラリ – データベース接続制御関数
ex.)
select dblink_connect(’conn1′,
‘host=dbsv port=5432 dbname=mydb user=scott password=tiger’);
* 検索(SELECT)
select *
from dblink(['{接続識別名}', ]
’select {列名}[, {列名}...]
from {オブジェクト名}’)
t1({列名} {データ型}[, {列名} {データ型}...]);
ex.)
select *
from dblink(’conn1′,
’select oid, relname
from pg_class’)
t1(oid oid, relname text);
* 更新(UPDATE/INSERT/DELETE)
select dblink_exec(['{接続識別名}', ]{DML文}[, fail_on_error]);
ex.)
select dblink_exec(’conn1′,
‘delete from emp where empno=7800′);
* データベースから切断
select dblink_disconnect(['{接続識別名}']); ex.)
select dblink_disconnect(’conn1′);
dblinkのテスト
接続
select dblink_connect('conn1','host=XXXXX port=5432 dbname=replication user=XXX password=XXXX');
切断
select dblink_disconnect('conn1');
検索
select dblink_connect('conn1','host=データベース1 port=5432 dbname=replication user=XXX password=XXX');
select * from dblink('conn1','select a from rep') t1(a integer);
select * from dblink('conn1','select count(*) as cnt from rep') t1(cnt integer);
select dblink_disconnect('conn1');
select dblink_exec('conn1','delete from emp where empno=7800');
select dblink_connect('conn1','host=データベース1 port=5432 dbname=replication user=XXX password=XXX');
select dblink_connect('conn2','host=データベース2 port=5432 dbname=replication user=XXX password=XXX');
select *
from
dblink('conn1','select count(*) as cnt from rep') t1(cnt integer),
dblink('conn2','select count(*) as cnt from rep') t2(cnt integer)
;
おー素晴らしいー
異なるデータベースをひとつのSQL文で取得できちゃいました。
cnt | cnt -----+----- 10 | 10 (1 row)
select dblink_disconnect(’conn1′);