18

使用带有postgres_fdw扩展名的 Postgres 9.6,有什么方法可以使本地模式中的表与远程数据库上的表保持同步?我经常需要将新表添加到远程数据库上的包装模式中,并希望通过 FDW 在本地访问它们,而不必在外部模式或单个表来/去时删除并重新导入它们。

我正在寻找一个命令,例如REFRESH FOREIGN SCHEMA schema_name.

4

3 回答 3

11

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

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 ;
于 2018-02-23T03:30:31.907 回答
8

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

IMPORT FOREIGN SCHEMA <foreign_schema> 
    LIMIT TO (<new_table1>, <new_table2>)
    FROM SERVER <foreign_server>
    INTO <local_schema>;
于 2019-09-06T15:44:37.517 回答
5

对于最近的 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 而不是 select and and string concatenation 滚动到函数中。

于 2020-12-18T14:54:21.150 回答