postgres - 如何测试外国 table 的同行是否确实存在

postgres - how to test if peer of foreign table actually exists

我有两个数据库:我们称它们为 primary(保存实际数据)和 fdw(包含主数据库中数据的外部数据包装器)。

我在 primary db:

中创建了简单的 table
create schema myschema;
create table myschema.foo (id bigint, whatever text);
create table myschema.foov as select * from foo;

我在 fdw 数据库中创建外部 table 通过视图访问主要 table:

create extension postgres_fdw;
create server remote_docker foreign data wrapper postgres_fdw options (host 'primary', dbname 'postgres', port '5432');
create schema remote_myschema;
create user mapping for current_user server remote_docker options (user 'postgres');
create foreign table remote_myschema.foo (id bigint, whatever text) server remote_docker options (schema_name 'myschema', table_name 'foov');

执行select * from remote_myschema.foo查询时,一切正常。

问题:如果我没有在 primary 数据库中创建视图,那么 fdw 数据库中的 create foreign table 命令无论如何都会无错误地通过。我只能在 fdw db 上执行查询时发现 primary db 中不存在视图。

问题:是否有可能检测到外来 table 绑定到不存在的原件?我在这两种情况下比较了外国 table 的 pg_class 数据,没有发现任何差异,也没有发现文档中的任何内容。目前我知道的唯一方法是捕获异常

do $$
declare
  ex boolean;
begin
  begin
    execute 'select null from remote_myschema.foo';
    ex := true;
  exception when others then
    ex := false;
  end;
  raise notice '%', ex::text;
end;
$$;

太糟糕了。

谢谢!

捕获异常是唯一的方法。除非你的站点有浏览量突然消失的习惯,否则你不用每次用国外的table都去测试。在创建后立即测试一次就足够了。