【问题标题】:Keep PostgreSQL (FDW) Foreign Schema In-Sync保持 PostgreSQL (FDW) 外部模式同步
【发布时间】:2017-08-29 12:16:44
【问题描述】:

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

我正在寻找诸如REFRESH FOREIGN SCHEMA schema_name 之类的命令。

【问题讨论】:

    标签: database postgresql foreign-data-wrapper


    【解决方案1】:

    我认为没有刷新,但拖放和导入应该不到一秒:

    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 ;
    

    【讨论】:

      【解决方案2】:

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

      IMPORT FOREIGN SCHEMA <foreign_schema> 
          LIMIT TO (<new_table1>, <new_table2>)
          FROM SERVER <foreign_server>
          INTO <local_schema>;
      

      【讨论】:

        【解决方案3】:

        使用最近的 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 而不是选择和字符串连接来滚动到函数中。

        【讨论】:

        • 或者使用存储过程: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$;
        猜你喜欢
        • 2016-12-21
        • 2015-07-09
        • 2017-05-17
        • 2021-08-11
        • 1970-01-01
        • 1970-01-01
        • 2021-03-13
        • 2019-07-01
        • 2012-12-04
        相关资源
        最近更新 更多