このトピックでは、dblink拡張機能について説明します。
背景情報
dblink拡張機能を使用すると、関数を使用してリモートPostgreSQLデータベースに接続できます。 dblink拡張機能は外部テーブルよりも柔軟であり、接続されたデータベースの関数やストレージプロシージャなどの不規則なオブジェクトを呼び出すために使用できます。
リモートデータベースのテーブルにのみアクセスする必要がある場合は、より高いパフォーマンスを確保するためにpostgres_fdwなどの外部テーブルを使用することをお勧めします。
dblink_connect
リモートデータベースへの永続的な接続をオンにします。
構文
dblink_connect(text connstr) はテキストを返します
dblink_connect(text connname, text connstr) はテキストを返します説明
dblink_connect() を使用して、リモートPostgreSQLデータベースへの接続を確立できます。 接続するサーバーとデータベースは、標準のlibpq接続文字列を使用して識別されます。 接続に名前を割り当てて、一度に複数の名前付き接続を有効にすることができます。 名前が割り当てられていない場合、一度に開くことができる名前のない接続は1つだけです。 接続は、閉じられるか、データベースセッションが終了するまで継続します。
既存の外部サーバーの名前を接続文字列として使用することもできます。 外部サーバーを使用するには、外部データラッパー
dblink_fdwを使用することを推奨します。
Parameters
パラメーター | 説明 |
connname | オンにする接続の名前。 このパラメーターを空のままにすると、既存の名前のない接続が新しい名前のない接続に置き換えられます。 |
connstr | 接続の確立に使用される |
戻り値
エラーが発生しない場合は、OKが返されます。 それ以外の場合、エラーが報告され、値は返されません。
例
SELECT dblink_connect('channel_name=localhost dbname=postgres');
dblink_connect
----------------
OK
(1行)
SELECT dblink_connect('myconn', 'channel_name=localhost dbname=postgres options=-csearch_path=');
dblink_connect
----------------
OK
(1行)
-- 外国データラッパー機能性
-- 注: ローカル接続はこれがきちんと働くためにパスワード認証を要求しなければなりません
-それ以外の場合は、dblink_connect() から次のエラーが表示されます。-エラー: パスワードが必要です
-- DETAIL: サーバーがパスワードを要求しない場合、非スーパーユーザーは接続できません。
-- HINT: 対象サーバの認証方法を変更する必要があります。
CREATE SERVER fdtest FOREIGN DATA WRAPPER dblink_fdw OPTIONS (channel_name 'localhost' 、dbname 'contrib_regression');
CREATE USER regress_dblink_user WITH PASSWORD「秘密」;
regress_dblink_userのユーザーマッピングを作成するサーバーfdtestオプション (ユーザー 'regress_dblink_user '、パスワード 'secret');
regress_dblink_userへの外国人サーバーの使用を承認します。テーブルfooを選択してregress_dblink_userを承認します。\set ORIGINAL_USER: ユーザー
\c - regress_dblink_user
SELECT dblink_connect('myconn', 'fdtest');
dblink_connect
----------------
OK
(1行)
SELECT * FROM dblink('myconn', 'SELECT * FROM foo') AS t(a int, b text, c text[]);
a | b | c
---- ---- ------------------
0 | a | {a0,b0,c0}
1 | b | {a1,b1,c1}
2 | c | {a2,b2,c2}
3 | d | {a3,b3,c3}
4 | e | {a4,b4,c4}
5 | f | {a5,b5,c5}
6 | g | {a6,b6,c6}
7 | h | {a7,b7,c7}
8 | i | {a8,b8,c8}
9 | j | {a9,b9,c9}
10 | k | {a10,b10,c10}
(11行)
\c - :ORIGINAL_USER
regress_dblink_userからの外国人サーバーfdtestの使用を取り消す;
REVOKE SELECT ON TABLE foo FROM regress_dblink_user;
regress_dblink_userサーバーfdtestのドロップユーザーマッピング;
ドロップユーザーregress_dblink_user;
ドロップサーバーfdtest; dblink_disconnect
リモートデータベースへの永続的な接続を閉じます。
構文
dblink_disconnect() はテキストを返します
dblink_disconnect(text connname) はテキストを返します
説明
dblink_connect() を使用して、dblink_connect() を使用して有効になっている接続を閉じることができます。 このパラメーターを空のままにすると、名前のない接続が閉じられます。
Parameters
パラメーター | 説明 |
connname | 閉じる接続の名前。The name of the connection that you want to close. |
戻り値
エラーが発生しない場合は、OKが返されます。 それ以外の場合、エラーが報告され、値は返されません。
例
SELECT dblink_disconnect();
dblink_disconnect
-------------------
OK
(1行)
SELECT dblink_disconnect('myconn');
dblink_disconnect
-------------------
OK
(1行) dblink
リモートデータベースでクエリを実行します。
構文
dblink(text connname, text sql [, bool fail_on_error]) はレコードセットを返します。dblink(text connstr, text sql [, bool fail_on_error]) はレコードセットを返します。dblink(text sql [, bool fail_on_error]) はレコードセットを返します。説明
dblinkを使用して、リモートデータベースでSQLクエリを実行できます。 ほとんどの場合、SELECTステートメントなど、行を返すすべての種類のSQLステートメントを使用できます。2つのテキストパラメーターを設定すると、最初のパラメーターの値が永続的な接続の名前として使用されます。 システムは、接続を使用してクエリを実行します。 接続が見つからない場合、第1のパラメータの値は、接続を確立するための接続文字列として使用される。 接続は、クエリが実行された場合にのみ持続します。
Parameters
パラメーター | 説明 |
connname | クエリが実行される接続の名前。 このパラメーターを空のままにすると、名前のない接続が使用されます。 |
connstr |
|
sql | リモートデータベースで実行するSQLクエリ。 例: |
fail_on_error | デフォルトでは、このパラメーターはtrueに設定されています。 リモートデータベースでスローされたエラーにより、ローカルエラーが発生します。 このパラメーターをfalseに設定し、リモートデータベースでエラーがスローされると、NOTICEが報告され、行は返されません。 |
戻り値
クエリによって生成された行が返されます。 dblinkは他のクエリで使用できます。 したがって、特定の列のセットではなくレコードを返すように宣言されます。 これは、クエリする列のセットを指定する必要があることを示します。 それ以外の場合、PostgreSQLデータベースはクエリを実行できません。 例:
SELECT *
dblinkから ('dbname=mydb options=-csearch_path='、
'pg_procからproname、prosrcを選択')
AS t1 (代名詞名、prosrcテキスト)
どこの代名詞LIKE 'bytea % '; 返される列の名前と型は、FROM句のaliasセクションで指定する必要があります。 エイリアスで列名を指定するのは標準のSQL構文ですが、列タイプを指定するのはPostgreSQL拡張機能の標準に従います。 別名セクションを使用すると、関数を実行する前に、* のスコープと、WHERE句で参照されている発音名をシステムが理解できます。 リモートデータベースからのクエリ結果がfrom句の指定された列数と一致しない場合、エラーがスローされます。 返されたデータ文字列がFROM句で宣言された列型の有効な入力である場合、クエリは成功します。
例
SELECT * FROM dblink('dbname=postgres options=-csearch_path='、
'pg_procからproname、prosrcを選択')
AS t1 (代名詞名、prosrcテキスト) 代名詞LIKE 'bytea % ';
proname | prosrc
----------- -----------------
byteacat | byteacat
byteaeq | byteaeq
bytealt | bytealt
byteale | byteale
byteagt | byteagt
byteage | byteage
byteane | byteane
byteacmp | byteacmp
bytealike | bytealike
byteansike | byteansike
byteain | byteain
byteaout | byteaout
(12行)
SELECT dblink_connect('dbname=postgres options=-csearch_path=');
dblink_connect
----------------
OK
(1行)
SELECT * FROM dblink('select proname, prosrc from pg_proc ')
AS t1 (代名詞名、prosrcテキスト) 代名詞LIKE 'bytea % ';
proname | prosrc
----------- -----------------
byteacat | byteacat
byteaeq | byteaeq
bytealt | bytealt
byteale | byteale
byteagt | byteagt
byteage | byteage
byteane | byteane
byteacmp | byteacmp
bytealike | bytealike
byteansike | byteansike
byteain | byteain
byteaout | byteaout
(12行)
SELECT dblink_connect('myconn', 'dbname=regression options=-csearch_path=');
dblink_connect
----------------
OK
(1行)
SELECT * FROM dblink('myconn', 'select proname, prosrc from pg_proc ')
AS t1 (代名詞名、prosrcテキスト) 代名詞LIKE 'bytea % ';
proname | prosrc
----------- -----------------
bytearecv | bytearecv
byteasend | byteasend
byteale | byteale
byteagt | byteagt
byteage | byteage
byteane | byteane
byteacmp | byteacmp
bytealike | bytealike
byteansike | byteansike
byteacat | byteacat
byteaeq | byteaeq
bytealt | bytealt
byteain | byteain
byteaout | byteaout
(14行) dblink_exec
リモートデータベースでコマンドを実行します。
構文
dblink_exec(text connname, text sql [, bool fail_on_error]) はテキストを返します。dblink_exec(text connstr, text sql [, bool fail_on_error]) はテキストを返します。dblink_exec(text sql [, bool fail_on_error]) はテキストを返します説明
dblink_execを使用して、行を返さないSQL文など、リモートデータベースでコマンドを実行できます。2つのテキストパラメーターを設定すると、最初のパラメーターの値が永続的な接続の名前として使用されます。 システムは接続を使用してコマンドを実行します。 接続が見つからない場合、第1のパラメータの値は、接続を確立するための接続文字列として使用される。 接続は、コマンドが実行された場合にのみ持続します。
Parameters
パラメーター | 説明 |
connname | コマンドが実行される接続の名前。 このパラメーターを空のままにすると、名前のない接続が使用されます。 |
connstr |
|
sql | リモートデータベースで実行するコマンド。 例: |
fail_on_error |
|
戻り値
クエリのステータスを示すコマンドまたはERRORのステータス文字列を返すことができます。
例
SELECT dblink_connect('dbname=dblink_test_standby ');
dblink_connect
----------------
OK
(1行)
SELECT dblink_exec('insert into foo values (21, ''z'', ''{" a0 "," b0 "," c0 "}'');');
dblink_exec
-----------------
挿入943366 1
(1行)
SELECT dblink_connect('myconn', 'dbname=regression');
dblink_connect
----------------
OK
(1行)
SELECT dblink_exec('myconn', 'insert into foo values (21, ''z'', ''{" a0 "," b0 "," c0 "}'');');
dblink_exec
------------------
挿入6432584 1
(1行)
SELECT dblink_exec('myconn' 、'insert into pg_class values ('''foo'') '、false);
注意: sqlエラー
DETAIL: ERROR: 列 "relnamespace" のnull値はnullでない制約に違反します
dblink_exec
-------------
エラー
(1行) dblink_open
リモートデータベースのカーソルをオンにします。
構文
dblink_open(text cursorname, text sql [, bool fail_on_error]) はテキストを返します。dblink_open(text connname, text cursorname, text sql [, bool fail_on_error]) はテキストを返します。説明
dblink_open()を使用して、リモートデータベースでカーソルをオンにし、dblink_fetch()およびdblink_close()を使用してカーソルに対して操作を実行できます。カーソルはトランザクションでのみ保持できます。 リモートデータベースがトランザクションにない場合、dblink_openはリモートデータベースでBEGINコマンドを使用して明示的なトランザクションブロックを開始します。 このトランザクションは、一致した
dblink_closeが実行された後にクローズされます。説明dblink_execを使用してdblink_openとdblink_closeの間でデータを変更し、エラーが発生した場合、またはdblink_closeの前にdblink_disconnectを使用した場合、トランザクションは中止され、変更は失われます。
Parameters
パラメーター | 説明 |
connname | カーソルがオンになっている接続の名前。 このパラメーターを空のままにすると、名前のない接続が使用されます。 |
cursorname | カーソルの名前。 |
sql | リモートデータベースで実行するSELECTクエリ。 例: |
fail_on_error |
|
戻り値
操作のステータスを示すOKまたはERRORが返されます。
例
SELECT dblink_connect('dbname=postgres options=-csearch_path=');
dblink_connect
----------------
OK
(1行)
SELECT dblink_open('foo' 、'select proname、pg_proc' からprosrc);
dblink_open
-------------
OK
(1行) dblink_fetch
リモートデータベースで開始されたカーソルから行を返します。
構文
dblink_fetch(text cursorname, int howmany [, bool fail_on_error]) はレコードセットを返します。dblink_fetch(text connname, text cursorname, int howmany [, bool fail_on_error]) はレコードセットを返します。説明
dblink_fetchを使用すると、dblink_openを使用してリモートデータベースで開始されたカーソルから行を返すことができます。リモートカーソルから返される列数がfrom句で指定した列数と一致しない場合は, エラーがスローされます。 リモートカーソルは、エラーが発生していない場合は、リモートカーソルが存在する行に戻されます。 dblink_fetchが完了した後にローカルクエリでエラーが発生した場合、カーソルもこの行に返されます。
Parameters
パラメーター | 説明 |
connname | カーソルで操作を実行するために使用される接続の名前。 このパラメーターを空のままにすると、名前のない接続が使用されます。 |
cursorname | 行を返すために使用されるカーソルの名前。 |
howmany | 取得される行の最大数。 検索は、カーソルが存在する現在の位置から開始し、行数が上限に達するか、カーソルがその終わりに達すると終了します。 |
fail_on_error |
|
戻り値
カーソルを使用して取得した行が返されます。 この関数を使用するには、クエリする列のセットを指定する必要があります。 詳細については、このトピックの「dblink」セクションをご参照ください。
例
SELECT dblink_connect('dbname=postgres options=-csearch_path=');
dblink_connect
----------------
OK
(1行)
SELECT dblink_open('foo' 、'select proname、pg_procからprosrc、pronameは ''bytea % ''' のような);
dblink_open
-------------
OK
(1行)
SELECT * FROM dblink_fetch('foo', 5) AS (funcname, source text);
funcname | ソース
--------- ------------
byteacat | byteacat
byteacmp | byteacmp
byteaeq | byteaeq
byteage | byteage
byteagt | byteagt
(5行)
SELECT * FROM dblink_fetch('foo', 5) AS (funcname, source text);
funcname | ソース
---------- ---------------
byteain | byteain
byteale | byteale
bytealike | bytealike
bytealt | bytealt
byteane | byteane
(5行)
SELECT * FROM dblink_fetch('foo', 5) AS (funcname, source text);
funcname | ソース
----------- -----------------
byteansike | byteansike
byteaout | byteaout
(2行)
SELECT * FROM dblink_fetch('foo', 5) AS (funcname, source text);
funcname | ソース
--------- ----------
(0行) dblink_close
リモートデータベースのカーソルを閉じます。
構文
dblink_close(text cursorname [, bool fail_on_error]) はテキストを返します
dblink_close(text connname, text cursorname [, bool fail_on_error]) はテキストを返します。説明
dblink_closeを使用して、dblink_openを使用してリモートデータベースで開始されたカーソルを閉じることができます。明示的なトランザクションブロックが
dblink_openによって開始され、閉じるカーソルが接続の最後のカーソルになる場合。dblink_closeは、一致するCOMMITを発行します。
Parameters
パラメーター | 説明 |
connname | カーソルが閉じられている接続の名前。 このパラメーターを空のままにすると、名前のない接続が使用されます。 |
cursorname | 閉じるカーソルの名前。 |
fail_on_error |
|
戻り値
操作のステータスを示すOKまたはERRORが返されます。
例
SELECT dblink_connect('dbname=postgres options=-csearch_path=');
dblink_connect
----------------
OK
(1行)
SELECT dblink_open('foo' 、'select proname、pg_proc' からprosrc);
dblink_open
-------------
OK
(1行)
SELECT dblink_close('foo');
dblink_close
--------------
OK
(1行) dblink_get_connections
オンになったすべての名前付きdblink接続の名前を返します。
構文
dblink_get_connections() はtext[] を返します説明
dblink_get_connectionsを使用して、オンになっているすべての名前付きdblink_get接続の名前の配列を返すことができます。
戻り値
接続名のテキスト配列が返されます。 名前付きdblink接続がオンになっていない場合、NULLが返されます。
例
SELECT dblink_get_connections();dblink_error_メッセージ
名前付き接続の最後のエラーメッセージを取得します。
構文
dblink_error_message(text connname) はテキストを返します説明
dblink_error_messageを使用して、特定の名前付き接続の最後のエラーメッセージを取得できます。
Parameters
パラメーター | 説明 |
connname | エラーメッセージが返される接続の名前。 |
戻り値
最後のエラーメッセージが返されます。 接続にエラーメッセージが存在しない場合は、空の文字列が返されます。
例
SELECT dblink_error_message('dtest1');dblink_send_query
リモートデータベースで非同期クエリを実行します。
構文
dblink_send_query(text connname, text sql) はintを返します説明
dblink_send_queryを使用して、リモートデータベースで非同期クエリを実行できます。 この方法では、クエリが完了するのを待つ必要はありません。 同じ接続で別の非同期クエリが実行されている場合、非同期クエリは存在できません。dblink_is_busyを使用して、非同期クエリのステータスを確認し、dblink_get_resultを使用して結果を収集できます。dblink_cancel_queryを使用して、アクティブな非同期クエリをキャンセルすることもできます。
Parameters
パラメーター | 説明 |
connname | 非同期クエリが実行される接続の名前。 |
sql | リモートデータベースで実行するSQLクエリ。 例: |
戻り値
クエリが成功した場合、1が返されます。 そうでなければ、0が返される。
例
SELECT dblink_send_query('dtest1', 'SELECT * FROM foo WHERE f1 < 3 ');dblink_is_busy
接続に対して非同期クエリが実行されているかどうかを確認します。
構文
dblink_is_busy(text connname) はintを返します説明
dblink_is_busyを使用して、接続に対して非同期クエリが実行されているかどうかを確認できます。
Parameters
パラメーター | 説明 |
connname | チェックする接続の名前。 |
戻り値
非同期クエリを実行すると、1が返されます。 そうでなければ、0が返される。 0が返された場合、dblink_get_resultはブロックされません。
例
SELECT dblink_is_busy('dtest1');dblink_get_結果
非同期クエリの結果を取得します。
構文
dblink_get_result(text connname [, bool fail_on_error]) はレコードセットを返します説明
dblink_get_resultを使用して、dblink_send_queryを使用して実行される非同期クエリの結果を収集できます。 クエリが完了していない場合、dblink_get_resultはクエリが完了するまで待機します。
Parameters
パラメーター | 説明 |
connname | 非同期クエリが実行される接続の名前。 |
fail_on_error |
|
戻り値
行を返すSQL文である非同期クエリを実行すると、クエリによって生成された行が返されます。 この関数を使用するには、クエリする列のセットを指定する必要があります。 詳細については、このトピックの「dblink」セクションをご参照ください。
行を返さないSQL文である非同期コマンドを実行すると、コマンドのステータス文字列を含む単一のテキスト列を持つ単一の行が返されます。 結果には、呼び出すFROM句に1つのテキスト列が含まれるように指定する必要があります。
非同期クエリが実行されていることを示す
dblink_send_queryに対して1が返された場合は、dblink_get_resultの関数を呼び出す必要があります。 dblink_get_resultの関数は、接続を使用して空のセット結果を取得する前に、クエリごとに呼び出す必要があります。dblink_send_queryおよびdblink_get_resultを使用する場合、dblinkは、行がローカルクエリプロセッサに返される前に、リモートクエリ全体の結果を取得します。 クエリが多数の行を返す場合、一時的なメモリ膨張がローカルセッションで発生します。dblink_openを使用してカーソルを実行し、そのカーソルを使用して一度に管理可能な数の行を照会することを推奨します。dblink()を使用することもできます。これは、大きな結果セットをディスクにスプールすることによって引き起こされるメモリの膨張を防ぐのに役立ちます。
例
contrib_regression=# SELECT dblink_connect('dtest1', 'dbname=contrib_regression ');
dblink_connect
----------------
OK
(1行)
contribut_regression=# SELECT * FROM
contribut_regression-# dblink_send_query('dtest1', 'select * from foo where f1 < 3 ') AS t1;
t1
----
1
(1行)
contrib_regression=# SELECT * FROM dblink_get_result('dtest1') AS t1(f1 int, f2 text, f3 text[]);
f1 | f2 | f3
---- ----- --------------
0 | a | {a0,b0,c0}
1 | b | {a1,b1,c1}
2 | c | {a2,b2,c2}
(3行)
contrib_regression=# SELECT * FROM dblink_get_result('dtest1') AS t1(f1 int, f2 text, f3 text[]);
f1 | f2 | f3
---- ---- ------
(0行)
contribut_regression=# SELECT * FROM
contribut_regression-# dblink_send_query('dtest1', 'select * from foo where f1 < 3; select * from foo where f1 > 6 ') AS t1;
t1
----
1
(1行)
contrib_regression=# SELECT * FROM dblink_get_result('dtest1') AS t1(f1 int, f2 text, f3 text[]);
f1 | f2 | f3
---- ----- --------------
0 | a | {a0,b0,c0}
1 | b | {a1,b1,c1}
2 | c | {a2,b2,c2}
(3行)
contrib_regression=# SELECT * FROM dblink_get_result('dtest1') AS t1(f1 int, f2 text, f3 text[]);
f1 | f2 | f3
---- ----- -------------------
7 | h | {a7,b7,c7}
8 | i | {a8,b8,c8}
9 | j | {a9,b9,c9}
10 | k | {a10,b10,c10}
(4行)
contrib_regression=# SELECT * FROM dblink_get_result('dtest1') AS t1(f1 int, f2 text, f3 text[]);
f1 | f2 | f3
---- ---- ------
(0行)
dblink_cancel_query
名前付き接続のアクティブなクエリをキャンセルします。
構文
dblink_cancel_query(text connname) はテキストを返します説明
dblink_cancel_queryを使用して、名前付き接続で実行されているクエリをキャンセルできます。 キャンセルは失敗するかもしれません。 たとえば、完全なリモートクエリはキャンセルできません。 キャンセルリクエストは、クエリが失敗する確率を向上させるだけです。 dblink_get_resultを呼び出すか、他のメソッドを使用して共通クエリプロトコルを完了する必要があります。
Parameters
パラメーター | 説明 |
connname | キャンセルするクエリが実行されている接続の名前。 |
戻り値
キャンセル要求が開始された場合、OKが返されます。 それ以外の場合、エラーメッセージのテキストが返されます。
例
SELECT dblink_cancel_query('dtest1');