0

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

像这样的东西:
DB1.fdw_table_a->DB2.table_a

fdw_table_a仅用于插入日志数据。这个表有一个id列,它是一个bigint序列。该序列存在于 DB1(在外部表上)和 DB2(“真实”表)中。这可以正常工作,一切都很好。

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

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

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

4

2 回答 2

4

仅当您省略语句id中的列时,才会使用该序列。INSERT但是 postgres_fdw 永远不会省略一列,正如您从执行计划中看到的那样。

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

于 2018-11-18T12:51:48.997 回答
0

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/

于 2020-06-19T06:40:56.187 回答