Foreign table 插入不使用远程序列

Foreign table inserts don't use the remote sequence

我有一组应用程序访问同一台服务器上的两个不同的 PostgreSQL 9.6 数据库。由于某些应用程序限制,一个应用程序通过一个数据库中的 FDW 访问少数 table 到另一个数据库。

像这样:
DB1.fdw_table_a -> DB2.table_a

fdw_table_a 仅用于日志数据的插入。这个 table 有一个 id 列,这是一个 bigint 序列。该序列存在于DB1(上外table)和DB2(上"real"table)。这一切正常。

现在需要让另一个应用程序(同样具有有限的访问能力)执行插入 "real" table、DB2.table_a。在测试中,我可以在 id 列中看到一些不一致的地方,但没有出现明显的问题。

我可以在面向客户的环境中看到按预期使用了 DB1 FDW 序列,但是当直接在 DB2 'real' table 上开始插入时,该序列将从 1 (因为它从未被使用过)。

在这种环境下,我们还应该考虑其他事情吗? 插入 table 的这两个序列重叠是否会引起一些问题?

仅当您在 INSERT 语句中省略 id 列时才会使用该序列。但是postgres_fdw绝不会遗漏一列,从执行计划可以看出。

解决该问题的一种方法是使用 包含 id 列的外部 table。然后任何对该外部 table 的插入都将使用该序列来填充该列。

以下 2014 年的计划今天仍然有效。

=# CREATE SEQUENCE seq;
CREATE SEQUENCE
=# CREATE VIEW seq_view AS SELECT nextval('seq') as a;
CREATE VIEW
=# CREATE EXTENSION postgres_fdw;
CREATE EXTENSION
=# CREATE SERVER postgres_server
-# FOREIGN DATA WRAPPER postgres_fdw
-# OPTIONS (host 'localhost', port '5433', dbname 'postgres');
CREATE SERVER
=# CREATE USER MAPPING FOR PUBLIC SERVER postgres_server OPTIONS (password '');
CREATE USER MAPPING
=# CREATE FOREIGN TABLE foreign_seq_table (a bigint)
-# SERVER postgres_server OPTIONS (table_name 'seq_view');
CREATE FOREIGN TABLE
=# CREATE FUNCTION foreign_seq_nextval() RETURNS bigint AS
-# 'SELECT a FROM foreign_seq_table;' LANGUAGE SQL;
CREATE FUNCTION
=# CREATE TABLE tab (a int DEFAULT foreign_seq_nextval());
CREATE TABLE
=# INSERT INTO tab VALUES (DEFAULT), (DEFAULT), (DEFAULT);
INSERT 0 3
=# SELECT * FROM tab;
 a
----
 9
10
11
(3 rows)

https://paquier.xyz/postgresql-2/global-sequences-with-postgres_fdw-and-postgres-core/