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...
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.
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.
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
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.
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.