标签: foreign-data-wrapper

保持PostgreSQL(FDW)外部架构同步

使用带postgres_fdw扩展的Postgres 9.6 ,有没有办法使本地模式中的表与远程数据库中的表保持同步?我经常需要在远程数据库的包装模式中添加新表,并希望通过FDW在本地访问它们,而不必删除和重新导入我的外部模式或单个表.

我正在寻找像这样的命令REFRESH FOREIGN SCHEMA schema_name.

database postgresql foreign-data-wrapper

9
推荐指数
3
解决办法
1645
查看次数

Postgres之外的数据库是否具有与外国数据包装器相当的功能?

我对最近添加的一些Postgres功能感到非常兴奋,比如外国数据包装器.我不知道有任何其他RDBMS有这个功能,但在我尝试向我的主客户端说明他们应该开始更喜欢Postgres而不是他们当前的RDBMS鸡尾酒,并且在我的情况下包括没有其他数据库可以做到这一点,我想验证一下.

我一直无法找到支持SQL/MED的任何其他数据库的证据,并且这样的简短说明表明Oracle不支持SQL/MED.

让我怀疑的主要问题是http://wiki.postgresql.org/wiki/SQL/MED上的声明:

SQL/MED是外部数据管理,是SQL标准的一部分,用于处理数据库管理系统如何集成存储在数据库外部的数据.

如果FDW基于SQL/MED,并且SQL/MED是开放标准,那么其他RDBMS似乎也可以实现它.

TL; DR:

Postgres之外的任何数据库是否都支持SQL/MED?

sql postgresql foreign-data-wrapper sql-med

8
推荐指数
1
解决办法
865
查看次数

如何在PostgreSQL中的外表SELECT MAX(id)查询中使用索引?

我有一个外表(使用postgresql_fdw外部数据包装器),我需要找到最大ID来复制所有记录.当我运行SELECT MAX(id) FROM foreign_table它似乎没有使用索引:

Aggregate  (cost=205.06..205.07 rows=1 width=4) (actual time=13999.535..13999.535 rows=1 loops=1)
  ->  Foreign Scan on foreign_table  (cost=100.00..197.75 rows=2925 width=4) (actual time=1.288..13632.768 rows=1849305 loops=1)
Planning time: 0.087 ms
Execution time: 14019.179 ms
Run Code Online (Sandbox Code Playgroud)

当我SELECT MAX(id) FROM table在"真实"表上运行相同的query()时,它使用索引:

Result  (cost=0.45..0.46 rows=1 width=0) (actual time=0.164..0.165 rows=1 loops=1)
  InitPlan 1 (returns $0)
    ->  Limit  (cost=0.43..0.45 rows=1 width=4) (actual time=0.152..0.153 rows=1 loops=1)
       ->  Index Only Scan Backward using table_pkey on table  (cost=0.43..46102.55 rows=1821907 width=4) (actual time=0.143..0.143 rows=1 loops=1)
             Index …
Run Code Online (Sandbox Code Playgroud)

database postgresql foreign-data-wrapper

7
推荐指数
1
解决办法
2105
查看次数

使用 Postgresql 外部数据包装器更新表

  1. t_user我创建了一个名为into的外部数据包装表mySchema

    IMPORT FOREIGN SCHEMA public LIMIT TO (t_user)
       FROM SERVER myServer INTO mySchema;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 这边添加了一些列,myServer但是t_user外表没有相应更新。

  3. 我尝试删除外部表t_user,但它被我的视图和物化视图使用t_user,因此删除失败。

关于如何更新此表有什么想法吗?

postgresql ddl foreign-data-wrapper

7
推荐指数
1
解决办法
6060
查看次数

如何在加入/推送到外部服务器之前强制评估子查询

假设我想查询一个带有几个WHERE过滤器的大表。我正在使用 Postgres 11 和外部表;外部数据包装器 (FDW) 是clickhouse_fdw. 但我也对通用解决方案感兴趣。

我可以这样做:

SELECT id,c1,c2,c3 from big_table where id=3 and c1=2
Run Code Online (Sandbox Code Playgroud)

我的 FDW 能够对远程外部数据源进行过滤,确保上述查询快速并且不会拉取太多数据。

如果我写的话上面的效果是一样的:

SELECT id,c1,c2,c3 from big_table where id IN (3,4,5) and c1=2
Run Code Online (Sandbox Code Playgroud)

即所有的过滤都被发送到下游。

但是,如果我尝试执行的过滤稍微复杂一些:

SELECT bt.id,bt.c1,bt.c2,bt.c3
from big_table bt
join lookup_table l on bt.id=l.id
where c1=2 and l.x=5
Run Code Online (Sandbox Code Playgroud)

然后查询规划器决定远程过滤c1=2,但在本地应用另一个过滤器。

在我的用例中,先计算哪些ids 有l.x=5,然后将其发送出去进行远程过滤会快得多,所以我尝试按以下方式编写:

SELECT id,c1,c2,c3
from big_table
where c1=2
and id IN (select id from lookup_table where x=5)
Run Code Online (Sandbox Code Playgroud)

big_table然而,查询规划器仍然决定在本地对satisfy的所有结果执行第二个过滤器c1=2,这非常慢。

有什么方法可以“强制”(select …

sql postgresql sql-execution-plan postgresql-performance foreign-data-wrapper

7
推荐指数
1
解决办法
1948
查看次数

如何使用postgres_fdw连接到本地主机?

我的想法是,我有一个名为的本地数据库northwind,并且postgres_fdw我想与另一个test在localhost上命名的数据库连接(远程连接模拟,例如在数据库中的表被更新时,在其他数据库中执行某些操作,例如保存到历史记录等。 )。所以我打开了psql控制台并输入:

CREATE SERVER app_db 
FOREIGN DATA WRAPPER postgres_fdw 
OPTIONS (dbname 'test', host 'localhost:5432');
Run Code Online (Sandbox Code Playgroud)

正如我在“查看外部数据包装器”链接中所发现的。接下来,我还将按照本教程进行操作:

CREATE USER MAPPING for postgres
SERVER app_db 
OPTIONS (user 'postgres', password 'postgres');
Run Code Online (Sandbox Code Playgroud)

(我假设用户名和密码应该与我在Hibernate中访问数据库时所使用的密码相同,并且在本current_user教程中postgres,就本教程而言,这是我的PgAdmin III中存在的唯一角色)。然后我创建了外表:

CREATE FOREIGN TABLE groups
(
  id serial NOT NULL,
  name character varying(255) NOT NULL,
  version integer DEFAULT 0
)
 SERVER app_db OPTIONS (table_name 'groups')
Run Code Online (Sandbox Code Playgroud)

没关系,我可以schema/foreign tables在PgAdmin III中找到它。但是当我尝试时,SELECT * FROM groups我得到了:

********** ERROR**********

ERROR: could not …
Run Code Online (Sandbox Code Playgroud)

database postgresql pgadmin foreign-data-wrapper postgresql-9.3

6
推荐指数
2
解决办法
5216
查看次数

强制 postgres_fdw 使用密码?

我有两个数据库设置为同一个 Postgresql 9.4 数据库集群的一部分,我正在尝试使用 postgres_fdw 从另一个访问其中一个中的表。我以超级用户身份进行了所有设置和工作,但是当我尝试以普通用户身份访问外部表时,出现以下错误:

ERROR:  password is required
DETAIL:  Non-superuser cannot connect if the server does not request a password.
HINT:  Target server's authentication method must be changed.
Run Code Online (Sandbox Code Playgroud)

现在我明白这是因为我为某些子网(包括它自己的子网)设置了信任身份验证的服务器。但是,在USER MAPPING我创建的 1 中,我确实指定了密码,希望这样做会强制它使用密码身份验证。显然没有这样的运气。

因此,我的问题是是否有办法解决这个有点繁重的要求?有没有办法强制此连接或特定用户或类似的人使用密码身份验证?或者某种方法来禁用该要求?或者我唯一的选择是更改配置以要求密码,并处理任何破坏?

postgresql foreign-data-wrapper

5
推荐指数
1
解决办法
2536
查看次数

Postgres:外表的外键

我有一个外国表,例如:

CREATE FOREIGN TABLE film (
    id          varchar(40) NOT NULL,
    title       varchar(40) NOT NULL,
    did         integer NOT NULL,
    date_prod   date,
    kind        varchar(10),
    len         interval hour to minute
)
SERVER film_server;
Run Code Online (Sandbox Code Playgroud)

ID为该表的主键(在远程数据库中设置)。我想让本地表引用外表,并在本地表上设置外键约束-例如:

CREATE TABLE actor (
    id          varchar(40) NOT NULL,
    name       varchar(40) NOT NULL,
    film_id       varchar(40) NOT NULL,
)

ALTER TABLE actor ADD CONSTRAINT actor_film_fkey FOREIGN KEY (film_id) 
    REFERENCES film(id);
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试添加外键约束时,出现错误:

ERROR:  referenced relation "film" is not a table
Run Code Online (Sandbox Code Playgroud)

是否可以向外表添加外键约束?

foreign-data-wrapper postgresql-9.4

5
推荐指数
1
解决办法
1889
查看次数

Azure PostgreSQL 外部数据包装器 postgres_fdw

我正在尝试使用来自 Azure DB for PostgreSQL 实例的 PostgreSQL 外部数据包装器 (postgres_fdw) 扩展。如 Azure DB for PostgreSQL 中所述,应支持外部数据包装器:https : //docs.microsoft.com/en-us/azure/postgresql/concepts-extensions

我设法为用户创建了服务器和映射,但是当我尝试导入表或架构时,出现以下错误:

ERROR:  could not connect to server "<server with public hostname on AWS>"
DETAIL:  could not translate host name "<server with public hostname on AWS>" to address: Unknown host
Run Code Online (Sandbox Code Playgroud)

当用公共 IP 替换主机名时,我得到以下信息:

ERROR:  could not connect to server "<SERVER NAME>"
DETAIL:  could not connect to server: Network is down (0x00002742/10050)
    Is the server running on host "<public IP of the server" and …
Run Code Online (Sandbox Code Playgroud)

postgresql azure amazon-web-services foreign-data-wrapper

5
推荐指数
1
解决办法
717
查看次数

SQL:创建具有枚举列的外部表时出错

我正在foo_tabledatabase_a 中创建一个外部表 ( )。foo_table住在 database_b 中。 foo_table将枚举 ( bar_type) 作为其列之一。因为这个枚举在database_b 中,所以在database_a 中创建外部表失败。database_a 不了解列类型。在 database_a 中运行以下命令

CREATE FOREIGN TABLE foo_table (id integer NOT NULL, bar bar_type) SERVER database_b

一个得到错误:

ERROR: type "bar_type" does not exist

我可以bar_type在 database_a 中创建一个副本,但这感觉重复,并且可能是未来不一致的原因。有人会对处理的最佳实践有什么想法吗?

sql postgresql enums foreign-data-wrapper

4
推荐指数
1
解决办法
1044
查看次数