保持PostgreSQL(FDW)外部架构同步

atd*_*fax 9 database postgresql foreign-data-wrapper

使用带postgres_fdw扩展的Postgres 9.6 ,有没有办法使本地模式中的表与远程数据库中的表保持同步?我经常需要在远程数据库的包装模式中添加新表,并希望通过FDW在本地访问它们,而不必删除和重新导入我的外部模式或单个表.

我正在寻找像这样的命令REFRESH FOREIGN SCHEMA schema_name.

小智 7

对于最近的 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
Run Code Online (Sandbox Code Playgroud)

应该使用 EXECUTE FORMAT 而不是 select 和字符串连接直接滚动到函数中。


use*_*861 6

我认为没有刷新,但删除和导入应该不到一秒钟:

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 ;
Run Code Online (Sandbox Code Playgroud)


小智 5

删除和重新创建绝对有效,但我不喜欢它,因为我经常有依赖于我的本地表(引用外部架构)的视图,因此删除架构也会删除所有视图。为了解决这个问题,您可以重新导入外部模式,但仅限于您创建的新表:

IMPORT FOREIGN SCHEMA <foreign_schema> 
    LIMIT TO (<new_table1>, <new_table2>)
    FROM SERVER <foreign_server>
    INTO <local_schema>;
Run Code Online (Sandbox Code Playgroud)