Kann man Cross-Database-Abfragen
mit PostgreSQL durchführen? So geht’s!
Wenn Sie mit PostgreSQL arbeiten, fragen Sie sich vielleicht, ob es möglich ist, Cross-Datenbank-Abfragen
durchzuführen. Dies tritt typischerweise auf, wenn Sie auf Daten zugreifen oder diese manipulieren müssen, die auf verschiedene Datenbanken verteilt sind. Eine häufige Situation ist, wenn zwei Datenbanken Daten teilen, aber separat eingerichtet sind - was zur Frage führt: Kann man auf eine Datenbank von einer anderen in PostgreSQL zugreifen?
Die Herausforderung von Cross-Datenbank-Abfragen
Sie könnten bei dem Versuch, eine Cross-Datenbank-Abfrage auszuführen, eine Fehlermeldung wie diese erhalten:
databaseA=# select * from databaseB.public.someTableName;
ERROR: Cross-Datenbank-Referenzen sind nicht implementiert: "databaseB.public.someTableName"
Dieser Fehler zeigt an, dass PostgreSQL keine direkten Referenzen zwischen Datenbanken nativ unterstützt. Daher, wenn Ihre Daten in separaten Datenbanken gespeichert sind und Sie Abfragen über diese Daten durchführen müssen, benötigen Sie eine alternative Lösung.
Die Lösung: Verwendung von Foreign Data Wrappers
Um Cross-Datenbank-Abfragen in PostgreSQL durchzuführen, können Sie die Funktion Foreign Data Wrapper verwenden, insbesondere postgres_fdw
. Dies ermöglicht Ihnen, ganz einfach auf Tabellen in jeder PostgreSQL-Datenbank zuzugreifen, unabhängig davon, ob sie lokal oder remote ist.
Einrichtung von postgres_fdw
-
Erweiterung installieren: Stellen Sie sicher, dass die
postgres_fdw
-Erweiterung in Ihrer PostgreSQL-Installation aktiviert ist. Sie können die Erweiterung mit dem folgenden Befehl erstellen:CREATE EXTENSION postgres_fdw;
-
Einen fremden Server definieren: Erstellen Sie einen fremden Server, der mit der Ziel-Datenbank verbunden ist:
CREATE SERVER foreign_server_name FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'host_address', dbname 'databaseB', port '5432');
-
Benutzermapping erstellen: Sie müssen ein Mapping für den Benutzer erstellen, um sich mit dem fremden Server zu verbinden:
CREATE USER MAPPING FOR local_user SERVER foreign_server_name OPTIONS (user 'remote_user', password 'remote_password');
-
Fremdes Schema importieren: Sie können das fremde Schema importieren, das die Tabellen enthält, auf die Sie zugreifen möchten:
IMPORT FOREIGN SCHEMA public FROM SERVER foreign_server_name INTO local_schema;
-
Remote-Tabelle abfragen: Jetzt können Sie die fremden Tabellen genauso abfragen wie normale lokale Tabellen:
SELECT * FROM local_schema.some_table_name;
Für ältere Versionen von PostgreSQL
Wenn Sie PostgreSQL-Versionen vor 9.3 verwenden, ist die Funktion des Foreign Data Wrappers nicht verfügbar. Allerdings können Sie die Funktion dblink
verwenden, mit der Sie sich mit anderen PostgreSQL-Datenbanken verbinden können.
- Verwendung von
dblink
: Sie müssen das Paketpostgresql-contrib
installieren, wenn es nicht bereits Teil Ihrer Distribution ist. Dann können Sie eine Abfrage wie diese ausführen:SELECT * FROM dblink('dbname=databaseB user=remote_user password=remote_password', 'SELECT * FROM public.some_table_name') AS t(column1 type1, column2 type2, ...);
Hinweis: Überlegen Sie immer, Ihre Datenbanken umzustrukturieren, wenn möglich. Die Verwendung von
Schemas
innerhalb derselben Datenbank statt separater Datenbanken kann das Datenmanagement und den Zugriff erheblich verbessern.
Fazit
Obwohl PostgreSQL nativ keine Cross-Datenbank-Abfragen unterstützt, bietet die Verwendung von Foreign Data Wrappers wie postgres_fdw
eine leistungsstarke Lösung. Durch die Einrichtung der erforderlichen Konfigurationen können Sie nahtlos auf Daten in verschiedenen Datenbanken zugreifen und diese manipulieren.
Wenn Sie eine ältere Version verwenden, denken Sie daran, dass dblink
eine Option ist, aber ein Upgrade auf die neuesten Versionen von PostgreSQL bessere Funktionalität und Unterstützung bieten kann.
Mit den richtigen Werkzeugen und Strategien ist der Zugriff auf Daten über Datenbanken hinweg einfacher denn je. Viel Spaß beim Abfragen!