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都去测试。在创建后立即测试一次就足够了。
我有两个数据库:我们称它们为 primary
(保存实际数据)和 fdw
(包含主数据库中数据的外部数据包装器)。
我在 primary
db:
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都去测试。在创建后立即测试一次就足够了。