Possibilité d'effectuer des recherches croisées avec postgres?

je vais deviner que la réponse est non basée sur le message d'erreur ci-dessous (et ce résultat de Google ), mais y a-t-il de toute façon pour effectuer une interrogation croisée de la base de données en utilisant Postgres?

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

je travaille avec des données qui sont réparties entre deux bases de données, bien que les données soient réellement partagées entre les deux (les colonnes userid dans une base de données proviennent de la table users dans l'autre base de données). Je ne sais pas pourquoi ce sont deux des bases de données séparées au lieu de schema, mais c'est la vie...

113
demandé sur Tom H 2008-09-05 21:09:13

6 réponses

Note: Comme l'a laissé entendre l'asker original, Si vous mettez en place deux bases de données sur la même machine, vous voudrez probablement faire deux schémas à la place - dans ce cas, vous n'avez pas besoin de quoi que ce soit de spécial pour les interroger.

mise à jour en date du 9.3

vous pouvez maintenant utiliser le nouveau postgres_fdw (wrapper de données étrangères) pour se connecter à des tables dans N'importe quelle base de données Postgres - local ou distant.

Veuillez noter qu'il y a emballages de données étrangers pour d'autres sources de données populaires . À l'heure actuelle, seuls postgres_fdw et file_fdw font partie de la distribution officielle de Postgres.

réponse originale pour pre-9.3

cette fonctionnalité ne fait pas partie de L'installation PostgreSQL par défaut, mais vous pouvez l'ajouter. Ça s'appelle dblink .

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

81
répondu Neall 2016-06-08 13:47:31

j'ai couru dans ce avant une est venu à la même conclusion sur les requêtes de base de données croisées que vous. Ce que j'ai fini par faire était en utilisant des schémas pour diviser l'espace de table de cette façon je pourrais garder les tables groupées mais toujours les interroger tous.

18
répondu stimms 2008-09-05 17:17:56

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

DBLINK exécute une requête (habituellement un SELECT, mais il peut être N'importe quel SQL l'énoncé qui renvoie des lignes) dans une base de données distante.

quand deux arguments de texte sont donnés, le premier est d'abord regardé vers le haut comme le nom d'une connexion persistante; si elle est trouvée, la commande est exécutée sur cette connexion. Si pas trouvé, le premier argument est traité comme un chaîne d'information de connexion comme pour dblink_connect, et l'indication la connexion est faite juste pour la durée de cette commande.

un des bons exemples:

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 cette information pour référence future. Refrence

11
répondu Manwal 2017-05-23 12:10:04

Juste pour ajouter un peu plus d'informations.

il n'y a aucun moyen d'interroger une base de données autre que la base actuelle. Parce que PostgreSQL charge des catalogues de systèmes spécifiques à la base de données, il n'est pas certain comment une requête de base de données croisée 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 fusionner les résultats du côté client.

PostgreSQL FAQ

9
répondu Esteban Küber 2010-05-06 21:10:59

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 déjà utilisé DB-Link et TDS-link avec grand succès.

5
répondu 2008-09-22 05:47:10

si la performance est importante et que la plupart des requêtes sont en lecture seule, je suggère de répliquer les données à une autre base de données. Bien que cela semble être une duplication inutile des données, cela pourrait être utile si des index sont nécessaires.

cela peut être fait avec simple sur insert triggers qui à leur tour appeler dblink pour mettre à jour une autre copie. Il y a aussi des options de réplication complètes (comme Slony) mais c'est hors sujet.

2
répondu dpavlin 2008-09-12 15:56:31