Postgresql: dblink в хранимых функциях из локальной в удаленную базу данных

Я проверяю ссылку ниже, которую я использовал, и она работает отлично. Но я хочу наоборот.

Postgresql: dblink в хранимых функциях

Мой сценарий: есть две базы данных. Я хочу скопировать данные одной таблицы из локальной в удаленную базу данных. Я использовал dblink для этого, но я не понимаю, как использовать dblink для хранения данных?

Имя локальной базы данных: localdatabase

Имя удаленной базы данных: remotedatabase

Может ли кто-нибудь предложить мне, как я могу это сделать?

Заранее спасибо.


person PrashantAdesara    schedule 06.09.2012    source источник
comment
В основном подход, описанный в ответе, будет работать для вас. Вы должны заменить dblink() на dblink_exec(), который должен использоваться для операторов SQL, не возвращающих строки (например, INSERT в вашем случае).   -  person dezso    schedule 06.09.2012
comment
Спасибо за быстрый ответ, но я хочу вставить все данные из локальной базы данных в удаленную. И в это время я нахожусь на локальной стороне и хочу передать все данные с помощью dblink. Является ли это возможным?   -  person PrashantAdesara    schedule 06.09.2012
comment
Пожалуйста, проверьте мой ответ ниже.   -  person dezso    schedule 06.09.2012


Ответы (1)


Что-то вроде строк ниже должно работать:

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 нет других операторов, возвращающих значение.

person dezso    schedule 06.09.2012
comment
Можно ли обновить запрос с процедурой с помощью dblink? - person PrashantAdesara; 10.09.2012