it-swarm.com.de

Zusammenführen von Ergebnissen aus zwei getrennten Datenbanken

Ist es möglich, JOIN Zeilen aus zwei separaten Postgres-Datenbanken zu erstellen?

Ich arbeite mit einem System mit mehreren Datenbanken auf einem Server und manchmal brauche ich wirklich eine solche Funktion.

51
sennin

Laut http://wiki.postgresql.org/wiki/FAQ

Es gibt keine Möglichkeit, eine andere als die aktuelle Datenbank abzufragen. Da PostgreSQL datenbankspezifische Systemkataloge lädt, ist ungewiss, wie sich eine datenbankübergreifende Abfrage überhaupt verhalten soll. contrib/dblink ermöglicht datenbankübergreifende Abfragen mit Funktionsaufrufen. Natürlich kann ein Client auch gleichzeitig Verbindungen zu verschiedenen Datenbanken herstellen und die Ergebnisse auf Client-Seite zusammenführen.

[~ # ~] edit [~ # ~] : 3 Jahre später (März 2014) ist dieser FAQ= Eintrag wurde überarbeitet und ist hilfreicher:

Wie führe ich Abfragen mit mehreren Datenbanken durch?

Es gibt keine Möglichkeit, eine andere als die aktuelle Datenbank direkt abzufragen. Da PostgreSQL datenbankspezifische Systemkataloge lädt, ist ungewiss, wie sich eine datenbankübergreifende Abfrage überhaupt verhalten soll.

Die SQL/MED-Unterstützung in PostgreSQL ermöglicht das Erstellen eines "Foreign Data Wrappers", der Tabellen in einer entfernten Datenbank mit der lokalen Datenbank verknüpft. Die entfernte Datenbank ist möglicherweise eine andere Datenbank auf derselben PostgreSQL-Instanz oder eine Datenbank auf halbem Weg um die Welt. postgres_fdw ist in PostgreSQL 9.3 integriert und bietet Lese-/Schreibunterstützung. Eine schreibgeschützte Version für 9.2 kann kompiliert und als Contrib-Modul installiert werden.

contrib/dblink ermöglicht datenbankübergreifende Abfragen mithilfe von Funktionsaufrufen und ist für viel ältere PostgreSQL-Versionen verfügbar. Im Gegensatz zu postgres_fdw können keine Bedingungen auf den Remote-Server "übertragen" werden, sodass häufig viel mehr Daten abgerufen werden, als Sie benötigen.

Natürlich kann ein Client auch gleichzeitig Verbindungen zu verschiedenen Datenbanken herstellen und die Ergebnisse auf Client-Seite zusammenführen.

53
ndtreviv

Vergiss dblink!

Sag Hallo zu Postgres_FDW :

So bereiten Sie den Fernzugriff mit postgres_fdw Vor:

  1. Installieren Sie die Erweiterung postgres_fdw Mit CREATE EXTENSION.

  2. Erstellen Sie mit CREATE SERVER Ein fremdes Serverobjekt, um jede entfernte Datenbank darzustellen, mit der Sie eine Verbindung herstellen möchten. Geben Sie die Verbindungsinformationen mit Ausnahme von Benutzer und Kennwort als Optionen des Serverobjekts an.

  3. Erstellen Sie mit CREATE USER MAPPING Eine Benutzerzuordnung für jeden Datenbankbenutzer, den Sie für den Zugriff auf jeden fremden Server zulassen möchten. Geben Sie den Remote-Benutzernamen und das Kennwort an, die als Benutzer- und Kennwortoptionen für die Benutzerzuordnung verwendet werden sollen.

  4. Erstellen Sie für jede entfernte Tabelle, auf die Sie zugreifen möchten, eine fremde Tabelle mit CREATE FOREIGN TABLE Oder IMPORT FOREIGN SCHEMA. Die Spalten der Fremdtabelle müssen mit der Remotetabelle übereinstimmen, auf die verwiesen wird. Sie können jedoch andere Tabellen- und/oder Spaltennamen als die entfernten Tabellen verwenden, wenn Sie die richtigen entfernten Namen als Optionen für das Fremdtabellenobjekt angeben.

Jetzt benötigen Sie nur noch SELECT aus einer Fremdtabelle, um auf die in der zugrunde liegenden entfernten Tabelle gespeicherten Daten zuzugreifen.

Es ist wirklich nützlich, auch bei großen Datenmengen.

27
Luiz Vaz

Ja, dies ist mit dblink möglich, wenn auch mit erheblichen Leistungsaspekten.

Für das folgende Beispiel muss der aktuelle SQL-Benutzer über Berechtigungen für beide Datenbanken verfügen. Befindet sich db2 Nicht im selben Cluster, müssen Sie dbname=db2 Durch die vollständige Verbindungszeichenfolge ersetzen, die in der dblink documentation definiert ist.

SELECT * 
FROM   table1 tb1 
LEFT   JOIN (
   SELECT *
   FROM   dblink('dbname=db2','SELECT id, code FROM table2')
   AS     tb2(id int, code text);
) AS tb2 ON tb2.column = tb1.column;

Wenn table2 Sehr groß ist, können Leistungsprobleme auftreten, da die Unterabfrage das gesamte table2 Lädt, bevor der Join ausgeführt wird.

7
Elliot B.

Nein, kannst du nicht. Sie könnten dblink verwenden, um eine Verbindung von einer Datenbank zu einer anderen Datenbank herzustellen, aber das hilft nicht, wenn Sie nach JOINs suchen.

Sie können nicht verschiedene SCHEMAs in einer einzigen Datenbank verwenden, um alle Ihre Daten zu speichern?

6
Frank Heikens

Du musst dblink benutzen ... wie araqnid oben erwähnte, funktioniert so etwas gut:

wählen Sie ST.Table_Name, ST.Column_Name, DV.Table_Name, DV.Column_Name, * aus information_schema.Columns aus. Column_Name text) in ST.Table_Name = DV.Table_name und ST.Column_Name = DV.Column_Name wobei ST.Column_Name null ist oder DV.Column_Name NULL ist

4
kenyee

Nur ein paar Schritte und Sie können das Ziel erreichen: Folgen Sie dieser Referenz Schritt für Schritt

WE HAVE BEEN CONNECTED TO DB2 WITH TABLE TBL2 AND COLUMN COL2
ALSO THERE IS DB1 WITH TBL1 AND COLUMN COL1

 *** connecting to second db ie db2
    Now just **copy paste the 1-7 processes** (make sure u use correct username and password and ofcourse db name)

    1.**CREATE EXTENSION dblink;**

    2.**SELECT pg_namespace.nspname, pg_proc.proname 
    FROM pg_proc, pg_namespace 
    WHERE pg_proc.pronamespace=pg_namespace.oid 
       AND pg_proc.proname LIKE '%dblink%';**

    3.**SELECT dblink_connect('Host=localhost user=postgres password=postgres dbname=db1');**

    4.**CREATE FOREIGN DATA WRAPPER postgres VALIDATOR postgresql_fdw_validator;**

    5.**CREATE SERVER postgres2 FOREIGN DATA WRAPPER postgres OPTIONS (hostaddr '127.0.0.1', dbname 'db1');**

    6.**CREATE USER MAPPING FOR postgres SERVER postgres2 OPTIONS (user 'postgres', password 'postgres');**

    7.**SELECT dblink_connect('postgres2');**

    ---Now, you can SELECT the data of Database_One from Database_Two and even join both db results:

    **SELECT * FROM public.dblink
    ('postgres2','SELECT col1,um_name FROM public.tbl1 ') 
    AS DATA(um_userid INTEGER),tbl2 where DATA.col1=tbl2.col2;**


You can also Check this :[How to join two tables of different databases together in postgresql [\[working finely in version 9.4\]][1]
2
Ipsita Upadhyay

Sie haben die dblink-Erweiterung von postgresql verwendet.

Verweis aus diesem Artikel:

DbLink-Erweiterung von PostgreSQL, mit der eine Datenbank mit einer anderen Datenbank verbunden wird.

Installieren Sie die DbLink-Erweiterung.

CREATE EXTENSION dblink;

Überprüfen Sie DbLink:

SELECT pg_namespace.nspname, pg_proc.proname 
FROM pg_proc, pg_namespace 
WHERE pg_proc.pronamespace=pg_namespace.oid 
   AND pg_proc.proname LIKE '%dblink%';

Ich habe bereits eine vollständige Demonstration vorbereitet. Besuchen Sie meinen Post, um Schritt für Schritt zu erfahren, wie Sie datenbankübergreifende Abfragen in Postgresql ausführen können.

2
Anvesh