Сохраняйте синхронизацию внешней схемы PostgreSQL (FDW)

Используя Postgres 9.6 с расширением postgres_fdw, есть ли какие-либо средства для того, чтобы таблицы, присутствующие в локальной схеме, были синхронизированы с таблицами в удаленной базе данных? Мне часто нужно добавлять новые таблицы в обернутую схему удаленной базы данных, и я хотел бы получить к ним доступ локально через FDW без необходимости отбрасывать и повторно импортировать мою внешнюю схему или отдельные таблицы по мере их поступления / ухода.

Ищу такую ​​команду, как REFRESH FOREIGN SCHEMA schema_name.


person atdfairfax    schedule 29.08.2017    source источник


Ответы (3)


Я не думаю, что есть обновление, но удаление и импорт должны занять меньше секунды:

DROP SCHEMA IF EXISTS local_schema_name CASCADE; 
CREATE SCHEMA local_schema_name ;
IMPORT FOREIGN SCHEMA foreign_schema_name 
    FROM SERVER foreign_server_name INTO local_schema_name ;
person user1487861    schedule 23.02.2018

Удаление и воссоздание определенно работает, но мне это не нравится, поскольку у меня часто есть представления, которые зависят от моих локальных таблиц (которые ссылаются на внешнюю схему), поэтому удаление схемы также приведет к удалению всех представлений. Чтобы обойти это, вы можете повторно импортировать внешнюю схему, но ограничить ее только новыми таблицами, которые вы создали:

IMPORT FOREIGN SCHEMA <foreign_schema> 
    LIMIT TO (<new_table1>, <new_table2>)
    FROM SERVER <foreign_server>
    INTO <local_schema>;
person Luke Olson    schedule 06.09.2019

С недавним postgres (я использую 13) следующее работает как обновление из psql. Таблицы заключены в кавычки, чтобы избежать использования таблиц, которые напоминают ключевые слова SQL, чтобы запутать синтаксический анализатор.

SELECT 'IMPORT FOREIGN SCHEMA <foreign_schema> EXCEPT ('|| 
   (SELECT string_agg('"'||table_name||'"',',') 
   FROM information_schema.tables 
   WHERE table_schema='<local_schema>') ||') 
FROM SERVER <foreign_server> INTO <local_schema>'\gexec

Должно быть прямолинейно переходить в функцию с использованием EXECUTE FORMAT вместо конкатенации выбора и и строки.

person sgrefen    schedule 18.12.2020
comment
Или с хранимой процедурой: CREATE OR REPLACE procedure refesh_foreign_tables() LANGUAGE plpgsql as $func$ BEGIN EXECUTE 'IMPORT FOREIGN SCHEMA public except (' || (SELECT string_agg('"'||table_name||'"', ', ') FROM information_schema.tables WHERE table_schema = 'public' and table_type = 'FOREIGN') || ') FROM SERVER standby INTO public;'; END $func$; - person nkmol; 11.05.2021