Search code examples
postgresqlforeign-data-wrapper

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


I have two databases: let's call them primary (which holds actual data) and fdw (which contains foreign-data-wrapper of data in primary db).

I create simple table in primary db:

create schema myschema;
create table myschema.foo (id bigint, whatever text);
create table myschema.foov as select * from foo;

I create foreign table in fdw db accessing primary table through view:

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');

When executing select * from remote_myschema.foo query, everything works ok.

The problem: if I didn't create view in primary db, the create foreign table command in fdw db passes without error anyway. I am able to discover the nonexistency of view in primary db only at time of query execution on fdw db.

The question: is somehow possible to detect that foreign table is bound to nonexistent original? I compared pg_class data of foreign table in both cases and didn't find any difference nor anything in documentation. The only way I know at this moment is catching exception

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;
$$;

which is awful.

Thanks!


Solution

  • Catching the exception is the only way. Unless views are in the habit of suddenly disappearing at your site, you don't have to test it every time you use the foreign table. Testing once, right after you created it, is good enough.