1

私が使用し、完全に実行されている以下のリンクを確認します。しかし、私はこれに反対したいと思います。

Postgresql: ストアド関数の dblink

私のシナリオ: 2 つのデータベースがあります。1 つのテーブル データをローカル データベースからリモート データベースにコピーしたいと考えています。これにdblinkを使用しましたが、dblinkを使用してデータを保存する方法がわかりませんか?

ローカル データベース名: localdatabase

リモート データベース名: remotedatabase

どうすればこれを行うことができますか?

前もって感謝します。

4

1 に答える 1

2

以下の行のようなものが機能するはずです。

SELECT dblink_connect('hostaddr=127.0.0.1 port=5432 dbname=mydb user=postgres password=mypasswd');
-- change the connection string to your taste

SELECT dblink_exec('INSERT INTO test (some_text) VALUES (''Text go here'');');

test次の定義を持つリモート データベース内のテーブルはどこにありますか。

CREATE TABLE test(
    id serial
    , some_text text
);

を実行した後dblink_exec()、リモート データベースで結果を確認できます (または、dblink()以下の例のように を使用してローカルで確認できます)。

SELECT * FROM dblink('SELECT id, some_text FROM test') AS d(id integer, some_text text);
 id |  some_text
----+--------------
  1 | Text go here
(1 row)

dblink_exec関数で呼び出しをラップすることもできます。

CREATE OR REPLACE FUNCTION f_dblink_test_update(val text, id integer) RETURNS text AS
$body$
SELECT dblink_exec('UPDATE torles.test SET some_text=' || quote_literal($1) || ' WHERE id = ' || $2);
$body$
LANGUAGE sql;

ご覧のとおり、クエリ文字列を動的に作成することもできます。 (この方法で SQL インジェクションの脆弱性をシステムに持ち込まないように注意する必要があるため、私がこのアプローチを推奨しているわけではありません。)

dblink_exec何をしたかについてのテキストメッセージを返すのでRETURNS text、呼び出しの後に他の値を返すステートメントがない限り、関数を として定義する必要がありdblink_execます。

于 2012-09-06T12:51:02.887 に答える