Hallo zusammen,
mit Hilfe der Extension postgres_fdw sind 2 Datenbanken (Version 10.3) miteinander verbunden. Die Installation und das prinzipielle Arbeiten haben wunderbar funktioniert.
Folgendes Problem habe ich beim Einfügen von Daten via dem Foreign Data Wrapper:
Auf der Remote-Datenbank werden Tabellen zumeist mit einer Identity-Spalte angelegt, ein Insert erfolgt ohne die Angabe der ID-Spalte:
tdb=> CREATE TABLE tdba.test_tbl
tdb-> ( id INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY
tdb(> , a INTEGER NOT NULL
tdb(> );
CREATE TABLE
tdb=> \d tdba.test_tbl
Tabelle »tdba.test_tbl«
Spalte | Typ | Sortierfolge | NULL erlaubt? | Vorgabewert
--------+---------+--------------+---------------+----------------------------------
id | integer | | not null | generated by default as identity
a | integer | | not null |
Indexe:
"test_tbl_pkey" PRIMARY KEY, btree (id)
tdb=> insert into tdba.test_tbl(a) values(1);
INSERT 0 1
Auf der lokalen Seite wurden die Extension, der Server und das User Mapping angelegt:
ldb=# CREATE EXTENSION postgres_fdw;
CREATE EXTENSION
ldb=# CREATE SERVER c74pg10 FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '172.16.49.122', dbname 'tdb', port '5432');
CREATE SERVER
ldb=# GRANT USAGE ON FOREIGN SERVER c74pg10 TO ldba;
GRANT
ldb=# \c - ldba
Passwort für Benutzer ldba:
Sie sind jetzt verbunden mit der Datenbank »ldb« als Benutzer »ldba«.
ldb=> CREATE USER MAPPING FOR ldba SERVER c74pg10 OPTIONS (user 'tdba', password <>);
CREATE USER MAPPING
Das Remote-Schema wurde lokal importiert, die Daten lassen sich lesen:
ldb=> IMPORT FOREIGN SCHEMA tdba FROM SERVER c74pg10 INTO ldba OPTIONS (import_default 'true');
IMPORT FOREIGN SCHEMA
ldb=>
ldb=> \d ldba.*
Fremdtabelle »ldba.test_tbl«
Spalte | Typ | Sortierfolge | NULL erlaubt? | Vorgabewert | FDW-Optionen
--------+---------+--------------+---------------+-------------+--------------------
id | integer | | not null | | (column_name 'id')
a | integer | | not null | | (column_name 'a')
Server: c74pg10
FDW-Optionen: (schema_name 'tdba', table_name 'test_tbl')
ldb=> select * from ldba.test_tbl;
id | a
----+---
1 | 1
(1 Zeile)
Jetzt soll das Insert in die Remote-Datenbank von der lokalen Seite aus ausgeführt werden. Das Insert erfolgt wieder ohne die Angabe der ID-Spalte, damit die Identity Definition greift:
ldb=> insert into ldba.test_tbl (a) values (2);
FEHLER: NULL-Wert in Spalte »id« verletzt Not-Null-Constraint
DETAIL: Fehlgeschlagene Zeile enthält (null, 2).
KONTEXT: Remote SQL command: INSERT INTO tdba.test_tbl(id, a) VALUES ($1, $2)
Das Ganze schlägt fehl, da im FDW scheinbar ein Insert mit allen Spalten generiert wird. Gibt es Möglichkeiten, dies so zu beeinflussen, so dass ein Insert wie vorgegeben gesendet wird? Es sollte die zugehörige Sequenz für die Remote-Tabelle verwendet werden.
Vielen Dank für die Unterstützung.
Grüße,
Ralph