PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 13.22 » Annexes » Modules supplémentaires fournis » postgres_fdw

F.33. postgres_fdw

Le module postgres_fdw fournit le wrapper de données distantes postgres_fdw, dont le but est de données accÚs à des données enregistrées dans des serveurs PostgreSQL externes.

Les fonctionnalitĂ©s proposĂ©es par ce module sont Ă  peu prĂšs les mĂȘmes que celles proposĂ©es par le module dblink. Mais postgres_fdw fournit une syntaxe plus transparente et respectant les standards pour l'accĂšs Ă  des tables distantes. Elle peut aussi donner de meilleures performances dans beaucoup de cas.

Pour prĂ©parer un accĂšs distant en utilisant postgres_fdw :

  1. Installez l'extension postgres_fdw en utilisant CREATE EXTENSION.

  2. Créez un objet serveur distant en utilisant CREATE SERVER, pour représenter chaque base distante à laquelle vous souhaitez vous connecter. Indiquez les informations de connexions, sauf user et password, comme options de l'objet serveur.

  3. Créez une correspondance d'utilisateur avec CREATE USER MAPPING pour chaque utilisateur de la base que vous voulez autoriser à accéder à un serveur distant. Indiquez le nom et le mot de passe de l'utilisateur distant avec les options user et password de la correspondance d'utilisateur.

  4. Créez une table distante avec CREATE FOREIGN TABLE ou IMPORT FOREIGN SCHEMA pour chaque table distante que vous voulez utiliser. Les colonnes de la table distante doit correspondre aux colonnes de la table sur le serveur distant. Néanmoins, vous pouvez utiliser un nom de table et des noms de colonne différents de ceux de la table sur le serveur distant si vous indiquez les bons noms de colonne en options de la table distante.

Maintenant, vous avez seulement besoin de SELECT sur la table distante pour accéder aux données de la table du serveur distant. Vous pouvez aussi modifier la table sur le serveur distant en utilisant les commandes INSERT, UPDATE, DELETE et COPY. (Bien sûr, l'utilisateur utilisé pour la connexion au serveur distant doit avoir les droits de faire tout cela.)

Notez que postgres_fdw n'a pour l'instant pas de support pour les instructions INSERT avec une clause ON CONFLICT DO UPDATE. NĂ©anmoins, la clause ON CONFLICT DO NOTHING est supportĂ©, si la spĂ©cification de l'index unique est omise. Notez aussi que postgres_fdw supporte le dĂ©placement de ligne demandĂ© par des instructions UPDATE exĂ©cutĂ©es sur des tables partitionnĂ©es, mais il ne gĂšre pas le cas oĂč une partition distante choisir pour insĂ©rer une ligne est aussi une partition cible d'UPDATE qui sera mise Ă  jour ultĂ©rieurement.

Il est gĂ©nĂ©ralement recommandĂ© que les colonnes d'une table distante soient dĂ©clarĂ©es avec exactement les mĂȘmes types de donnĂ©es et le mĂȘme collationnement que celles utilisĂ©es pour les colonnes rĂ©fĂ©rencĂ©es dans le table du serveur distant. Bien que postgres_fdw est actuellement assez lĂąche sur les conversions de type de donnĂ©es, des anomalies sĂ©mantiques surprenantes peuvent survenir quand les types ou les collationnements ne correspondent pas dans le cas oĂč le serveur distant interprĂšte lĂ©gĂšrement diffĂ©remment les conditions de la requĂȘte.

Notez qu'une table distante peut ĂȘtre dĂ©clarĂ©e avec moins de colonnes ou avec les colonnes dans un ordre diffĂ©rent. La correspondance des colonnes sur la table du serveur distant se fait par nom, et non pas par position.

F.33.1. Options FDW de postgres_fdw

F.33.1.1. Options de connexions

Un serveur distant utilisant le wrapper de donnĂ©es distantes postgres_fdw peut avoir les mĂȘmes options que celles acceptĂ©es par libpq dans les chaĂźnes de connexion comme dĂ©crit dans Section 33.1.2. Cependant, ces options ne sont pas autorisĂ©es ou sont gĂ©rĂ©es d'une façon spĂ©ciale :

  • user, password et sslpassword (spĂ©cifiez-les au niveau de la correspondance d'utilisateur instead, ou utilisez un fichier service)

  • client_encoding (ceci est configurĂ© automatiquement Ă  partir de l'encodage du serveur local)

  • fallback_application_name (toujours configurĂ© Ă  postgres_fdw)

  • sslkey et sslcert - ils peuvent apparaĂźtre soit dans une connexion, soit dans la correspondance d'utilisateur soit dans les deux. Si ce dernier cas est vrai, la configuration de la correspondance d'utilisateur surcharge la configuration de la connexion.

Seuls les superutilisateurs peuvent créer ou modifier des correspondances d'utilisateur avec les paramÚtres sslcert et sslkey.

Seuls les superutilisateurs peuvent se connecter à un serveur distant sans authentification par mot de passe. Donc spécifiez toujours l'option password pour les correspondances d'utilisateur appartenant aux utilisateurs simples.

Un superutilisateur peut dĂ©passer cette vĂ©rification sur une base par-correspondance-utilisateur en configurant l'option password_required 'false', par exemple :

ALTER USER MAPPING FOR some_non_superuser SERVER loopback_nopw
OPTIONS (ADD password_required 'false');
    

Pour empĂȘcher des utilisateurs sans droit d'exploiter les droits d'authentification de l'utilisateur unix utilisĂ© par le serveur PostgreSQL pour escalader vers des droits superutilisateur, seul le superutilisateur peut configurer cette option sur une correspondance d'utilisateur.

Une grande attention est nĂ©cessaire pour s'assurer que cela n'autorise pas l'utilisateur Ă  se connecter comme un superutilisateur sur la base de donnĂ©es distante d'aprĂšs les CVE-2007-3278 et CVE-2007-6601. Ne configurez pas password_required=false sur le rĂŽle public. Gardez en tĂȘte que l'utilisateur peut potentiellement utiliser tout certificat client, le fichier .pgpass, le fichier .pg_service.conf, et les autres fichiers se trouvant dans le rĂ©pertoire personnel unix de l'utilisateur systĂšme qui exĂ©cute le serveur PostgreSQL. Ils peuvent aussi utiliser toute relation de confiance autorisĂ©e par les modes d'authentification comme peer et ident.

F.33.1.2. Options pour le nom de l'objet

Ces options peuvent ĂȘtre utilisĂ©es pour contrĂŽler les noms utilisĂ©s dans les requĂȘtes SQL envoyĂ©es au serveur PostgreSQL distant. Ces options sont nĂ©cessaires lorsqu'une table distante est créée avec des noms diffĂ©rents de ceux de la table du serveur distant.

schema_name

Cette option, qui peut ĂȘtre indiquĂ©e pour une table distante, donne le nom du schĂ©ma Ă  utiliser pour la table du serveur distant. Si cette option est omise, le nom du schĂ©ma de la table distante est utilisĂ©.

table_name

Cette option, qui peut ĂȘtre indiquĂ©e pour une table distante, donne le nom de la table Ă  utiliser pour la table du serveur distant. Si cette option est omise, le nom de la table distante est utilisĂ©.

column_name

Cette option, qui peut ĂȘtre indiquĂ©e pour une colonne d'une table distante, donne le nom de la colonne Ă  utiliser pour la colonne de la table du serveur distant. Si cette option est omise, le nom de la colonne de la table distante est utilisĂ©.

F.33.1.3. Options d'estimation du coĂ»t

postgres_fdw rĂ©cupĂšre des donnĂ©es distantes en exĂ©cutant des requĂȘtes sur des serveurs distants. IdĂ©alement, le coĂ»t estimĂ© du parcours d'une table distante devrait ĂȘtre celui occasionnĂ© par le parcours de la table sur le serveur distant, et un supplĂ©ment causĂ© par la communication entre le serveur local et le serveur distant. Le moyen le plus fiable d'obtenir une telle estimation est de demander au serveur distant, puis d'ajouter quelque chose pour le supplĂ©ment. Pour des requĂȘtes simples, cela ne vaut pas le coĂ»t d'une requĂȘte supplĂ©mentaire vers le serveur distant. Donc postgres_fdw propose les options suivantes pour contrĂŽler la façon dont l'estimation de coĂ»t est faite :

use_remote_estimate

Cette option, qui peut ĂȘtre indiquĂ©e pour une table distante ou pour un serveur distant, contrĂŽle si postgres_fdw exĂ©cute des commandes EXPLAIN distantes pour obtenir les estimations de coĂ»t. Une configuration sur la table distante surcharge celle sur le serveur, mais seulement pour cette table. La valeur par dĂ©faut est false.

fdw_startup_cost

Cette option, qui peut ĂȘtre indiquĂ©e pour un serveur distant, est une valeur numĂ©rique qui est ajoutĂ©e au coĂ»t de dĂ©marrage estimĂ© de tout parcours de table distante sur ce serveur. Cela reprĂ©sente le coĂ»t supplĂ©mentaire causĂ© par l'Ă©tablissement d'une connexion, l'analyse et la planification de la requĂȘte du cĂŽtĂ© du serveur distant, etc. La valeur par dĂ©faut est 100.

fdw_tuple_cost

Cette option, qui peut ĂȘtre indiquĂ©e pour un serveur distant, est une valeur numĂ©rique qui est utilisĂ©e comme coĂ»t supplĂ©mentaire par ligne pour les parcours de la table distante sur ce serveur. Cela reprĂ©sente le coĂ»t supplĂ©mentaire associĂ© au transfert de donnĂ©es entre les serveurs. Vous pouvez augmenter ou rĂ©duire ce nombre pour reflĂ©ter les latences rĂ©seau vers le serveur distant. La valeur par dĂ©faut est 0.01.

Quand use_remote_estimate est vrai, postgres_fdw obtient le nombre de lignes et les estimations de coĂ»t Ă  partir du serveur distant. Il ajoute fdw_startup_cost et fdw_tuple_cost aux estimations de coĂ»t. Quand use_remote_estimate est faux, postgres_fdw rĂ©alise le dĂ©compte local des lignes ainsi que l'estimation de coĂ»t, puis ajoute fdw_startup_cost et fdw_tuple_cost aux estimations de coĂ»t. Cette estimation locale a peu de chances d'ĂȘtre prĂ©cise sauf si des copies locales des statistiques de la table distante sont disponibles. ExĂ©cuter ANALYZE sur la table distante permet de mettre Ă  jour les statistiques locales ; cela exĂ©cute un parcours sur la table distante, puis calcule et enregistre les statistiques comme si la table Ă©tait locale. Garder des statistiques locales peut ĂȘtre utile pour rĂ©duire la surcharge de planification par requĂȘte pour une table distante mais, si la table distante est frĂ©quemment mise Ă  jour, les statistiques locales seront rapidement obsolĂštes.

F.33.1.4. Options d'exĂ©cution Ă  distance

Par dĂ©faut, seules les clauses WHERE utilisant des opĂ©rateurs et des fonctions intĂ©grĂ©s sont considĂ©rĂ©s pour une exĂ©cution sur le serveur distant. Les clauses impliquant des fonctions non intĂ©grĂ©es sont vĂ©rifiĂ©es localement une fois les lignes rĂ©cupĂ©rĂ©es. Si ces fonctions sont disponibles sur le serveur distant et peuvent produire les mĂȘmes rĂ©sultats que localement, les performances peuvent ĂȘtre amĂ©liorĂ©es en envoyant ces clauses WHERE pour une exĂ©cution distante. Ce comportement peut ĂȘtre contrĂŽlĂ© en utilisant l'option suivante :

extensions

Cette option est une liste de noms d'extensions PostgreSQL, sĂ©parĂ©s par des virgules, installĂ©es dans des versions compatibles sur les serveurs local et distant. Les fonctions et opĂ©rateurs immutables et appartenant Ă  une extension listĂ©e seront considĂ©rĂ©es pour une exĂ©cution sur le serveur distant. Cette option peut seulement ĂȘtre spĂ©cifiĂ©e sur les serveurs distants, et non pas par table.

Lors de l'utilisation de l'option extensions, il est de la responsabilitĂ© de l'utilisateur que les extensions listĂ©es existent bien et se comportent de façon identique sur les serveurs local et distant. Dans le cas contraire, les requĂȘtes pourraient Ă©chouer ou se comporter de façon inattendue.

fetch_size

Cette option indique le nombre de lignes que postgres_fdw doit récupérer à chaque opération de lecture. Cette option est disponible au niveau serveur et table. Une configuration spécifiée sur une table surcharge celle du serveur. La valeur par défaut est 100.

F.33.1.5. Options de mise Ă  jour

Par dĂ©faut, toutes les tables distantes utilisant postgres_fdw sont supposĂ©es comme Ă©tant modifiables. Cela peut se surcharger en utilisant l'option suivante :

updatable

Cette option contrĂŽle si postgres_fdw autorise les tables distantes Ă  ĂȘtre modifiĂ©es en utilisant les commandes INSERT, UPDATE et DELETE. Cette option est utilisable sur une table distante ou sur un serveur distant. La configuration de cette option au niveau table surcharge celle au niveau serveur. La valeur par dĂ©faut est true.

Bien sûr, si la table distante n'est pas modifiable, une erreur surviendra malgré tout. L'utilisation de cette option permet principalement que l'erreur soit renvoyée localement, sans avoir à tenter l'exécution sur le serveur distant. Notez néanmoins que les vues information_schema indiqueront que la table distante est modifiable ou pas, suivant la configuration de cette option, et donc sans vérification du serveur distant.

F.33.1.6. Options d'import

postgres_fdw est capable d'importer les dĂ©finitions des tables distantes en utilisant IMPORT FOREIGN SCHEMA. Cette commande crĂ©e les dĂ©finitions des tables distantes sur le serveur local, correspondant aux tables et vues prĂ©sentes sur le serveur distant. Si les tables distantes Ă  importer ont des colonnes de type dĂ©fini par des utilisateurs, le serveur local doit avoir des types compatibles de mĂȘme nom.

Le comportement de l'import est personnalisable avec les options suivantes (Ă  fournir Ă  la commande IMPORT FOREIGN SCHEMA) :

import_collate

Cette option contrĂŽle si les options COLLATE d'une colonne sont inclus dans les dĂ©finitions des tables distantes importĂ©es Ă  partir d'un serveur distant. La valeur par dĂ©faut est true. Vous pourriez avoir besoin de la dĂ©sactiver si le serveur distant possĂšde un ensemble de noms de collation diffĂ©rent de celui du serveur local, ce qui risque d'ĂȘtre le cas s'il utilise un autre systĂšme d'exploitation. NĂ©anmoins, si vous le faites, il existe un risque sĂ©vĂšre que les collations importĂ©es des colonnes de la table ne correspondent pas aux donnĂ©es, rĂ©sultant en un comportement anormale de la requĂȘte.

MĂȘme quand ce paramĂštre est configurĂ© Ă  true, importer des colonnes dont la collation est la valeur par dĂ©faut du serveur distant peut se rĂ©vĂ©ler risquĂ©. Elles seront importĂ©es avec COLLATE "default", qui sĂ©lectionnera la collation par dĂ©faut du serveur local, qui pourrait bien ĂȘtre diffĂ©rente de celle du serveur distant.

import_default

Cette option contrĂŽle si les expressions DEFAULT d'une colonne sont incluses dans les dĂ©finitions des tables distantes importĂ©es d'un serveur distant. La valeur par dĂ©faut est false. Si vous activez cette option, faites attention au fait que les valeurs par dĂ©faut pourraient ĂȘtre calculĂ©es diffĂ©remment sur le serveur local et sur le serveur distant ; par exemple, nextval() est une source habituelle de problĂšmes. La commande IMPORT Ă©chouera si une expression par dĂ©faut importĂ©e utilise une fonction ou un opĂ©rateur qui n'existe pas localement.

import_generated

Cette option contrÎle si les expressions GENERATED de colonnes sont incluses dans les définitions des tables distantes importées à partir d'un serveur distant. La valeur par défaut est true. La commande IMPORT échouera si une expression importée utilise une fonction ou un opérateur qui n'existe pas localement.

import_not_null

Cette option contrÎle si les contraintes NOT NULL des colonnes sont incluses dans les définitions des tables distantes importées à partir d'un serveur distant. La valeur par défaut est true.

Notez que les contraintes autres que NOT NULL ne seront jamais importĂ©es des tables distantes. Bien que PostgreSQL supporte les contraintes CHECK sur les tables distantes, rien n'existe pour les importer automatiquement Ă  cause du risque qu'une expression de contrainte puisse ĂȘtre Ă©valuĂ©e diffĂ©remment entre les serveurs local et distant. Toute incohĂ©rence du comportement d'une contrainte CHECK pourrait amener des erreurs difficile Ă  dĂ©tecter dans l'optimisation des requĂȘtes. Donc, si vous souhaitez importer les contraintes CHECK, vous devez le faire manuellement et vous devez vĂ©rifier la sĂ©mantique de chaque contrainte avec attention. Pour plus de dĂ©tails sur le traitement des contraintes CHECK sur les tables distantes, voir CREATE FOREIGN TABLE.

Les tables ou tables distantes qui sont des partitions d'autres tables sont automatiquement exclues. Les tables partitionnées sont importées, à moins qu'elles soient des partitions d'une autre table. Puisque toutes les données à traver la table partitionnées qui est à la racine de toute la hiérarchie de partitionnement, cette approche devrait autoriser l'accÚs à toutes les données sans avoir besoin de créer d'objets supplémentaires.

F.33.2. Gestion des connexions

postgres_fdw Ă©tablit une connexion au serveur distant lors de la premiĂšre requĂȘte qui utilise une table distante associĂ©e avec le serveur distant. La connexion est conservĂ©e et rĂ©utilisĂ©e pour les requĂȘtes suivants de la mĂȘme session. NĂ©anmoins, si plusieurs identitĂ©s d'utilisateur (correspondances d'utilisateur) sont utilisĂ©es pour accĂ©der au serveur distant, une connexion est Ă©tablie pour chaque correspondance d'utilisateur.

F.33.3. Gestion des transactions

Lorsqu'une requĂȘte rĂ©fĂ©rence des tables sur un serveur distant, postgres_fdw ouvre une transaction sur le serveur distant si une transaction n'est pas dĂ©jĂ  ouverte pour la transaction locale en cours. La transaction distante est validĂ©e ou annulĂ©e suivant que la transaction locale est validĂ©e ou annulĂ©e. Les points de sauvegardes sont gĂ©rĂ©s de la mĂȘme façon en crĂ©ant les points de sauvegarde correspondants.

La transaction distante utilise le niveau d'isolation SERIALIZABLE quand la transaction locale a le niveau SERIALIZABLE. Dans les cas contraires, elle utilise le niveau REPEATABLE READ. Ce choix assure que, si une requĂȘte rĂ©alise plusieurs parcours de table sur le serveur distant, elle obtiendra des rĂ©sultats cohĂ©rents pour tous les parcours. Une consĂ©quence est que les requĂȘtes successives Ă  l'intĂ©rieur d'une seule transaction verront les mĂȘmes donnĂ©es provenant du serveur distant, mĂȘme si des mises Ă  jour sont rĂ©alisĂ©es en mĂȘme temps avec l'activitĂ© standard du serveur. Ce comportement serait attendue de toute façon si la transaction locale utilise le niveau d'isolation SERIALIZABLE ou REPEATABLE READ mais elle pourrait surprendre pour une transaction locale en niveau READ COMMITTED. Une prochaine version de PostgreSQL pourrait modifier ce comportement.

Notez que postgres_fdw ne supporte pas actuellement de préparer la transaction distante pour une validation en deux phases (2PC).

F.33.4. Optimisation des requĂȘtes distantes

postgres_fdw tente d'optimiser les requĂȘtes distantes pour rĂ©duire la quantitĂ© de donnĂ©es transfĂ©rĂ©es depuis les serveurs distants. Cela se fait en envoyant les clauses WHERE au serveur distant pour exĂ©cution, et en ne rĂ©cupĂ©rant que les colonnes nĂ©cessaires pour la requĂȘte courante. Pour rĂ©duire le risque de mauvaise exĂ©cution des requĂȘtes, les clauses WHERE ne sont pas envoyĂ©es au serveur distant sauf si elles utilisent seulement des types de donnĂ©es, opĂ©rateurs et fonctions intĂ©grĂ©es ou appartenant Ă  une extension listĂ©e dans l'option extensions du serveur distant. Les opĂ©rateurs et fonctions dans ce type de clause doivent aussi ĂȘtre IMMUTABLE. Pour une requĂȘte UPDATE ou DELETE, postgres_fdw tente d'optimiser l'exĂ©cution de la requĂȘte en envoyant la requĂȘte complĂšte au serveur distant s'il n'existe pas de clauses WHERE pouvant ĂȘtre envoyĂ©es au serveur distant, pas de jointures locales pour la requĂȘte, pas de triggers BEFORE ou AFTER au niveau ligne ou de colonnes calculĂ©es automatiquement sur la table cible, et pas de contraintes CHECK OPTION pour les vues parentes. Dans un UPDATE, les expressions Ă  affecter aux colonnes cibles doivent seulement utiliser les types de donnĂ©es intĂ©grĂ©es, les opĂ©rateurs ou les fonctions IMMUTABLE pour rĂ©duire le risque de mauvaise exĂ©cution de la requĂȘte.

Quand postgres_fdw rencontre une jointure entre des tables externes sur le mĂȘme serveur distant, il envoie la jointure entiĂšre au serveur distant, sauf s'il pense qu'il sera plus efficace de rĂ©cupĂ©rer les lignes de chaque table individuellement ou si les rĂ©fĂ©rences de table sont sujet Ă  des correspondances d'utilisateur diffĂ©rentes. Lors de l'envoi des clauses JOIN, il prend les mĂȘmes prĂ©cautions que mentionnĂ©es ci-dessus pour les clauses WHERE.

La requĂȘte envoyĂ©e au serveur distant pour exĂ©cution peut ĂȘtre examinĂ©e en utilisant EXPLAIN VERBOSE.

F.33.5. Environnement d'exĂ©cution de requĂȘtes distantes

Dans les sessions distantes ouvertes par postgres_fdw, le paramĂštre search_path est configurĂ© Ă  pg_catalog, pour que seuls les objets internes soient visibles, sauf utilisant d'un nom de schĂ©ma. Ceci n'est pas un problĂšme pour les requĂȘtes gĂ©nĂ©rĂ©es par postgres_fdw lui-mĂȘme car il fournit toujours ce type de qualification. NĂ©anmoins, cela peut se rĂ©vĂ©ler problĂ©matique pour les fonctions exĂ©cutĂ©es sur le serveur distant via des triggers ou des rĂšgles sur les tables distantes. Par exemple, si une table distante est en fait une vue, toute fonction utilisĂ©e dans cette vue sera exĂ©cutĂ©e avec le chemin de recherche restreint. Il est recommandĂ© de qualifier tous les noms dans ce type de fonctions ou de leur attacher une option SET search_path (voir CREATE FUNCTION) pour Ă©tablir le chemin de recherche attendu.

De mĂȘme, postgres_fdw Ă©tablie une configuration des sessions distantes pour diffĂ©rents paramĂštres :

  • TimeZone est positionnĂ© Ă  UTC

  • datestyle est positionnĂ© Ă  ISO

  • IntervalStyle est positionnĂ© Ă  postgres

  • extra_float_digits est positionnĂ© Ă  3 pour les serveurs distants de version 9.0 et aprĂšs et est positionnĂ© Ă  2 pour les versions plus anciennes

Ces paramĂštres sont moins Ă  mĂȘme d'ĂȘtre problĂ©matique que search_path, mais ils peuvent ĂȘtre gĂ©rĂ©s avec les options de fonction SET si le besoin devait se faire sentir.

Il n'est pas recommandĂ© de surcharger ce comportement en modifiant la configuration de la session pour ces paramĂštres. Cela peut ĂȘtre la cause d'un mauvais fonctionnement de postgres_fdw.

F.33.6. CompatibilitĂ© entre versions

postgres_fdw peut ĂȘtre utilisĂ© avec les serveurs distants de version 8.3 et ultĂ©rieures. En lecture seule, il est possible d'aller aussi loin que la 8.1. NĂ©anmoins, une limitation est que postgres_fdw assume gĂ©nĂ©ralement que les fonctions et opĂ©rateurs internes immutables sont sĂ»rs pour ĂȘtre envoyĂ©s au serveur distant pour exĂ©cution s'ils apparaissent dans une clause WHERE de la table distante. Du coup, une fonction interne ajoutĂ©e depuis la sortie du serveur distant pourrait ĂȘtre envoyĂ©e pour exĂ©cution, rĂ©sultant en un message d'erreur indiquant que la fonction n'existe pas (« function does not exist Â») ou une erreur similaire. Ce type d'Ă©chec peut ĂȘtre contournĂ© en réécrivant la requĂȘte, par exemple en embarquant la table distance dans un sous-SELECT avec OFFSET 0 comme optimisation, et plaçant la fonction ou l'opĂ©rateur problĂ©matique en dehors du sous-SELECT.

F.33.7. Exemples

Voici un exemple de crĂ©ation d'une table distante avec postgres_fdw. Tout d'abord, il faut installer l'extension :

CREATE EXTENSION postgres_fdw;
  

Ensuite, il faut crĂ©er un serveur distant avec CREATE SERVER. Dans cet exemple, nous souhaitons nous connecter Ă  un serveur PostgreSQL sur l'hĂŽte 192.83.123.89 Ă©coutant sur le port 5432. La base de donnĂ©es sur le serveur distant sur laquelle la connexion est faite s'appelle foreign_db :

CREATE SERVER foreign_server
        FOREIGN DATA WRAPPER postgres_fdw
        OPTIONS (host '192.83.123.89', port '5432', dbname 'foreign_db');
   

Une correspondance d'utilisateur, dĂ©finie avec CREATE USER MAPPING, est Ă©galement nĂ©cessaire pour identifier le rĂŽle qui sera utilisĂ© sur le serveur distant :

CREATE USER MAPPING FOR local_user
        SERVER foreign_server
        OPTIONS (user 'foreign_user', password 'password');
   

Il est maintenant possible de crĂ©er une table distante avec CREATE FOREIGN TABLE. Dans cet exemple, nous souhaitons accĂ©der Ă  la table nommĂ©e some_schema.some_table sur le serveur distant. Le nom local pour celle-ci sera foreign_table :

CREATE FOREIGN TABLE foreign_table (
        id integer NOT NULL,
        data text
)
        SERVER foreign_server
        OPTIONS (schema_name 'some_schema', table_name 'some_table');
   

Il est essentiel que les types de données et autres propriétés des colonnes déclarées dans CREATE FOREIGN TABLE correspondent à la vraie table distante. Les noms des colonnes doivent également correspondre, à moins que des options column_name soient attachées aux colonnes individuelles pour montrer comment elles sont nommées sur la table distante. Dans de nombreux cas, l'utilisation de IMPORT FOREIGN SCHEMA est préférable à la construction manuelle des tables distantes.

F.33.8. Auteur

Shigeru Hanada