5

Postgres では、 を使用して他のデータベースにリンクできますdblinkが、構文は非常に冗長です。たとえば、次のことができます。

SELECT *
FROM dblink (
    'dbname=name port=1234 host=host user=user password=password',
    'select * from table'
) AS users([insert each column name and its type here]);

これをより速く行う方法はありますか?たぶん、接続を事前に定義しますか?

create foreign tablePostgres にMySQL データベースに接続するための新しい機能があることに気付きました。より単純な構文ですdblink。私はそれを使用できますか?

4

2 に答える 2

7

PostgreSQL 8.4 以降では、外部データ ラッパー機能を使用して接続パラメータを定義できます。次に、dblink コマンドで外部サーバー名を参照するだけです。ドキュメントの例を参照してください。

PostgreSQL 9.1 以降では、外部データ ラッパー機能を使用して外部テーブルを定義し、dblink をまったく使用せずにリモート データベースに透過的にアクセスできます。そのためには、postgresql_fdwまだどの製品リリースにも含まれていないラッパーを入手する必要がありますが、インターネットで実験的なコードを見つけることができます。実際には、このルートは将来のオプションです。

于 2011-10-20T03:55:12.183 に答える
4

@Peter Explainsのように接続パラメーターFOREIGN SERVERオブジェクトにラップすることはできますが、残りはまだ詳しく説明する必要があります。

すべてをビューまたは関数にカプセル化できるため、入力は 1 回だけです。関数を使用した例 - スーパーユーザーとして実行:

CREATE OR REPLACE FUNCTION f_lnk_tbl()
  RETURNS TABLE(tbl_id int, col1 text, log_ts timestamp) AS
$BODY$

SELECT *
  FROM dblink(
  'SELECT tbl_id, col1, log_ts
   FROM   tbl
   ORDER  BY tbl_id'::text) AS b(
 tbl_id int
,col1   text
,log_ts timestamp);

$BODY$ LANGUAGE sql STABLE SECURITY DEFINER;
REVOKE ALL ON FUNCTION f_lnk_tbl() FROM public;


CREATE OR REPLACE FUNCTION f_sync()
  RETURNS text AS
$BODY$

SELECT dblink_connect('hostaddr=123.123.123.123 port=5432 dbname=mydb
                       user=postgres password=*secret*');

INSERT INTO my_local_tbl SELECT * FROM f_lnk_tbl();
-- more tables?

SELECT dblink_disconnect();

$BODY$
  LANGUAGE sql VOLATILE SECURITY DEFINER;
REVOKE ALL ON FUNCTION blob.f_dbsync() FROM public;
-- GRANT ....;
于 2011-10-19T23:24:32.047 に答える