Question

Je suppose que la réponse est "non", basé sur la ci-dessous le message d'erreur (et ce résultat Google), mais est-il de toute façon à effectuer un cross-requête de base de données à l'aide de PostgreSQL?

databaseA=# select * from databaseB.public.someTableName;
ERROR:  cross-database references are not implemented:
 "databaseB.public.someTableName"

Je suis en train de travailler avec des données qui est partitionné entre deux bases de données même si les données sont vraiment partagés entre les deux (userid colonnes dans une base de données proviennent de l' users le tableau dans l'autre base de données).Je n'ai aucune idée de pourquoi ces deux bases de données distinctes au lieu de schéma, mais c est la vie...

Était-ce utile?

La solution

Note:Comme l'original asker implicite, si vous êtes à la mise en place de deux bases de données sur la même machine, vous voudrez probablement faire deux les schémas au lieu de cela - dans ce cas, vous n'avez pas besoin de quelque chose de spécial pour interroger à travers eux.

Mise à jour du 9.3

Vous pouvez maintenant utiliser le nouveau postgres_fdw (foreign data wrapper) pour se connecter à des tables dans toute base de données Postgres - local ou distant.

Notez qu'il existe foreign data wrappers pour les autres principales sources de données.À cette époque, seuls les postgres_fdw et file_fdw font partie de l'officiel Postgres distribution.

Réponse originale à cette question pour le pré-9.3

Cette fonctionnalité ne fait pas partie de la valeur par défaut de PostgreSQL installer, mais vous pouvez l'ajouter en.Il est appelé dblink.

Je n'ai jamais utilisé, mais il est mis à jour et distribué avec le reste de PostgreSQL.Si vous utilisez la version de PostgreSQL qui est fourni avec votre distribution Linux, vous devrez peut-être installer un paquet postgresql-contrib.

Autres conseils

J'ai couru dans cette avant que l'un est arrivé à la même conclusion à propos de la croix-requêtes de base de données que vous.Ce que j'ai fait a l'aide de schémas de diviser l'espace de la table de cette façon, je pouvais faire des tableaux regroupés, mais encore de les interroger tous.

dblink() -- exécute une requête dans une base de données distante

dblink exécute une requête (généralement une sélection, mais il peut être n'importe quelle SQL l'énoncé qui renvoie des lignes) dans une base de données distante.

Lorsque le texte de deux arguments sont donnés, le premier est d'abord regardé comme une connexion persistante à son nom;si trouvé, la commande est exécutée sur cette connexion.Si pas trouvé, le premier argument est traité comme un infos de connexion de la chaîne comme pour dblink_connect, et l'a indiqué la connexion est faite juste pour la durée de cette commande.

un bon exemple:

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;

Note:Je donne ces informations pour référence ultérieure. Refrence

Juste pour ajouter un peu plus d'informations.

Il n'existe aucun moyen pour interroger une base de données autre que l'actuel.Parce que PostgreSQL charges spécifiques aux bases de données catalogues système, il est incertain de la façon dont une de la croix-requête de base de données devrait même se comporter.

contrib/dblink permet les requêtes de base de données à l'aide d'appels de fonction.Bien sûr, un client peut également faire des connexions simultanées à différentes bases de données et de fusionner les résultats sur le côté client.

FAQ de PostgreSQL

Oui, vous le pouvez en utilisant DBlink (postgresql seulement) et DBI-Link (permet à l'étranger de la croix-base de données queriers) et TDS_LInk qui permet des requêtes à exécuter sur le serveur MS SQL.

J'ai utilisé DB-Link et TDS-lien avant avec un grand succès.

Si les performances sont importantes et la plupart des requêtes sont en lecture seule, je vous propose de répliquer les données vers une autre base de données.Bien que cela semble comme inutiles pour la duplication de données, il peut aider si les index sont nécessaires.

Cela peut être fait avec un simple sur les déclencheurs d'insertion qui à son tour appel de dblink de mettre à jour une autre copie.Il y a aussi de plein fouet les options de réplication (comme Slony) mais c'est hors-sujet.

Dans le cas où quelqu'un a besoin d'un plus impliqués exemple sur la façon de faire de la croix-requêtes de base de données, voici un exemple qui nettoie la databasechangeloglock tableau sur chaque base de données dont il dispose:

CREATE EXTENSION IF NOT EXISTS dblink;

DO 
$$
DECLARE database_name TEXT;
DECLARE conn_template TEXT;
DECLARE conn_string TEXT;
DECLARE table_exists Boolean;
BEGIN
    conn_template = 'user=myuser password=mypass dbname=';

    FOR database_name IN
        SELECT datname FROM pg_database
        WHERE datistemplate = false
    LOOP
        conn_string = conn_template || database_name;

        table_exists = (select table_exists_ from dblink(conn_string, '(select Count(*) > 0 from information_schema.tables where table_name = ''databasechangeloglock'')') as (table_exists_ Boolean));
        IF table_exists THEN
            perform dblink_exec(conn_string, 'delete from databasechangeloglock');
        END IF;     
    END LOOP;

END
$$
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top