Frage zu postgres_fdw

Hallo,
ich habe die Extension postgres_fdw eingerichtet mittels dieser Anleitung.

CREATE FOREIGN TABLE clonegeoname (
  geonameid integer NOT NULL,
  name character varying(200),
  asciiname character varying(200),
  alternatenames text,
  latitude double precision,
  longitude double precision,
  fclass character(1),
  fcode character varying(10),
  country character varying(2),
  cc2 character varying(60),
  admin1 character varying(20),
  admin2 character varying(80),
  admin3 character varying(20),
  admin4 character varying(20),
  population bigint,
  elevation integer,
  dem integer,
  timezone character varying(40),
  moddate date
)
SERVER tourismserver;

Resultat:

Abfrage erfolgreich…

Dann:

SELECT
name
FROM 
clonegeoname
WHERE
geonameid = 6255148;

Resultat:

FEHLER: Relation „public.clonegeoname“ existiert nicht
SQL Status:42P01
Kontext:Remote SQL command: SELECT name FROM public.clonegeoname WHERE ((geonameid = 6255148))

Ich sehe auch die Tabelle clonegeoname nicht in meinen PgAdmin…wie gehe ich das Problem an?

Du hast das doch auf einen entfernten Server gemacht, also die Tabelle angelegt. Hast Du auch DORT geschaut?

Ich mache das alles local…

user-mapping vergessen?

http://michael.otacoo.com/postgresql-2/postgres-9-3-feature-highlight-postgres_fdw/

Nein, ich poste mal alle Schritte:

  1. über PgAdmin mich in meiner Datenbank “turism” eingeloggt
    Lt Manual ( http://www.postgresql.org/docs/9.3/static/postgres-fdw.html ):
CREATE EXTENSION postgres_fdw;

Resultat

Abfrage erfolgreich…

CREATE SERVER tourismserver FOREIGN DATA WRAPPER postgres_fdw;

Resultat

Abfrage erfolgreich…

CREATE USER MAPPING FOR postgres SERVER tourismserver OPTIONS (user 'postgres', password 'xxx');

Resultat

Abfrage erfolgreich…

Hierbei habe ich denselben User und das selbe Passwort genommen, welches ich nutze um mich beim Postgresserver anzumelden
5.

CREATE FOREIGN TABLE clonegeoname (
  geonameid integer NOT NULL,
  name character varying(200),
  asciiname character varying(200),
  alternatenames text,
  latitude double precision,
  longitude double precision,
  fclass character(1),
  fcode character varying(10),
  country character varying(2),
  cc2 character varying(60),
  admin1 character varying(20),
  admin2 character varying(80),
  admin3 character varying(20),
  admin4 character varying(20),
  population bigint,
  elevation integer,
  dem integer,
  timezone character varying(40),
  moddate date
)
SERVER tourismserver;

Resultat

Abfrage erfolgreich…

SELECT
name
FROM 
clonegeoname
WHERE
geonameid = 6255148;

Resultat

FEHLER: Relation „public.clonegeoname“ existiert nicht
SQL Status:42P01
Kontext:Remote SQL command: SELECT name FROM public.clonegeoname WHERE ((geonameid = 6255148))

Es gibt 2 Datenbanken, eine heisst tourism, die zweite heisst geonames.
Von der Datenbak tourism aus möche ich auf die Daten von geonames zugreifen, und zwar aus der Tabelle geoname.

Ich sehe auch keine Verbindung zur Datenbank geoname?..

Es ist wohl so, daß Du mit create foreign table die Tabelle auf dem anderen Server nicht erstellst, sondern nur lokal, also wo Du grad bist, die Tabelle definierst. Es wird wohl nicht geprüft, ob diese auch da ist. Ich hab da auch noch keine Erfahrungen mit, aber kurze Tests lassen mich das so vermuten. Dazu kommt:

Now you need only SELECT from a foreign table to access the data stored in its underlying remote table. You can also modify the remote table using INSERT, UPDATE, or DELETE.

Da steht nix von DDL-Befehlen.

Soll heissen, du siehst jetzt mal keine Fehler bei der Erstellung und lt. Manual sollte es funktionieren?

das mach ich ja

Die Tabelle muß auf dem fremden server existieren, mit create foreign table erzeugts Du sie NICHT auf dem entfernten Server, sondern definierst nur für den lokalen server, wie die Tabelle aufgebaut ist.

Ich konnte das soweit nachvollziehen, daß alles funktioniert, nur der select bzw. insert nicht. Hab dann auf dem fremden Server die Tabelle erst mal angelegt, dann ging es.

Also, ich hab jetzt nochmal alles gelöscht und fang nochmal von vorn an:
Jetzt bin ich bei dem Punkt:

CREATE SERVER myserver FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'foo', dbname 'foodb', port '5432');

myserver => tourismserver
host => 127.0.0.1
dbname => ??? Was setz ich hier ein? geonames oder tourism?

die andere DB halt.

Ok, dasgeht jetzt, allerdings müssen die Tabellen in den einzelnen Datenbanken eindeutige Namen haben…
Ich hatte sowohl in der einen als auch in der anderen Datenbank eine Tabelle mit dem Namen alternatename, und ich vermute, das gibt Konflikte bei der Abfrage.

Auf jeden Fall hier mal der komplette und funktionierende Code:

CREATE EXTENSION postgres_fdw;

CREATE SERVER tourismserver FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '127.0.0.1', dbname 'geonames');

CREATE USER MAPPING FOR postgres SERVER tourismserver OPTIONS (user 'postgres', password 'xxx');

CREATE FOREIGN TABLE geoname (
  geonameid integer NOT NULL,
  name character varying(200),
  asciiname character varying(200),
  alternatenames text,
  latitude double precision,
  longitude double precision,
  fclass character(1),
  fcode character varying(10),
  country character varying(2),
  cc2 character varying(60),
  admin1 character varying(20),
  admin2 character varying(80),
  admin3 character varying(20),
  admin4 character varying(20),
  population bigint,
  elevation integer,
  dem integer,
  timezone character varying(40),
  moddate date
)
SERVER tourismserver;

SELECT
name
FROM 
geoname
WHERE
geonameid = 6255148;

Resultat

;name
1;“Europe”

Auf zu neuen Problemen…