Всем привет! Сегодня я расскажу, как в pgsql пероенести данные из одной базы данных в другую. Например вы восстановили базу из бэкапа и часть нужных данных осталась в старой БД. Казалос бы всё просто:
выполняем
insert into DB2.dbo.table_name (f1,f2,f3) select f1,f2,f3 from DB1.dbo.table_name
и всё.
А вот фиг там! Postgree зараза выполняет запросы не на сервере, а в конретной базе данных..
Но если долго мучится ....

Итак.
Нам понадобится процедурка dblink, которая умеет коннектится к доугим бд, даже если они принадлежат другим юзерам или располагаюся на разных хостах, что очень удобно. Но... ее нужно добавить в БД самостоятельно.
Под виндами заходим в папку C:\\Program Files (x86)\\PostgreSQL\\8.4\\share\\contrib и через pgAdmin импортируем скрипт dblink.sql в нашу базу (в которую будем копировать данные)
Под никсами достаточно выполнить
psql -U dbuser -d dbname < /usr/pgsql-9.0/share/contrib/dblink.sql ,
где
dbuser и dbname - пользователь и имя бд соответственно
Дальше заходим в pgAdmin и в конечной БД пишем запрос
insert into dst_table (id, time)
select * from dblink(\'dbname=src_db\',\'SELECT id, time FROM src_table\')
as t2(id integer, time integer)
where time>=1000;
где:
dst_table = конечная таблица (в которую будут вставлены записи)
src_table = исходная табличка (с которой будут копироватся данные по условию)
where time>=1000; - условие по которому отбираются данные в src_table
Profit!
P.S. незабудьте перечислить типы данных исходной таблички!
P.P.S. Если нужен коннект к другой бд на другом хосте, можно попробовать написать так
insert into tableA
select *
from dblink(\'dbname=postgres hostaddr=xxx.xxx.xxx.xxx dbname=mydb user=postgres\',
\'select a,b from tableB\')
as t1(a text,b text);
Офф. мануал по dblink:
http://www.postgresql.org/docs/9.1/static/contrib-dblink-function.html