PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 16.10 » Annexes » Modules et extensions supplémentaires fournis » postgres_fdw -- accéder à des données enregistrées dans des serveurs PostgreSQL externes

F.38. postgres_fdw -- accĂ©der Ă  des donnĂ©es enregistrĂ©es dans des serveurs PostgreSQL externes #

Le module postgres_fdw fournit le wrapper de données distantes postgres_fdw, dont le but est de donner 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, COPY et TRUNCATE. (Bien sûr, l'utilisateur distant que vous avez spécifié dans vos correspondances d'utilisateur doit avoir les droits pour réaliser ces actions.)

Notez que l'option ONLY spécifiée dans SELECT, UPDATE, DELETE ou TRUNCATE n'a pas d'effet lors des accÚs ou modifications d'une table distante.

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Ă©e, 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 ailleurs dans la mĂȘme commande.

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 la table du serveur distant. Bien que postgres_fdw soit 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.38.1. Options FDW de postgres_fdw #

F.38.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 34.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, ou utilisez un fichier service)

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

  • application_name - ceci pourrait apparaĂźtre dans une ou les deux connexion et postgres_fdw.application_name. Si les deux sont prĂ©sents, postgres_fdw.application_name surcharge le paramĂštre de connexion. Contrairement Ă  libpq, postgres_fdw permet Ă  application_name d'inclure des « sĂ©quences d'Ă©chappement Â». Voir postgres_fdw.application_name pour les dĂ©tails.

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

Des utilisateurs non-superutilisateur peuvent se connecter Ă  des serveurs distants en utilisant l'authentification par mot de passe ou les pouvoirs dĂ©lĂ©guĂ©s GSSAPI, donc indiquez l'option password pour la correspondance d'utilisateur appartenant Ă  de non-superutilisateurs oĂč l'authentification par mot de passe est requise.

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.38.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 (string)

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 (string)

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 (string)

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.38.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 (boolean)

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 (floating point)

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 (floating point)

Cette option, qui peut ĂȘtre indiquĂ©e pour un serveur distant, est une valeur en virgule flottante 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.

L'option suivante contrĂŽle comme une telle opĂ©ration ANALYZE se comporte :

analyze_sampling (string)

Cette option, qui peut ĂȘtre indiquĂ©e pour une table distante ou pour un serveur distant, dĂ©termine si ANALYZE sur une table distante Ă©chantillonne les donnĂ©es du cĂŽtĂ© distant, ou lit et transfert toutes les donnĂ©es, et rĂ©alise l'Ă©chantillonnage localement. Les valeurs acceptĂ©es sont off, random, system, bernoulli et auto. off dĂ©sactive l'Ă©chantillonnage Ă  distance, donc toutes les donnĂ©es sont transfĂ©rĂ©es et Ă©chantillonnĂ©es localement. random rĂ©alise un Ă©chantillonnage Ă  distance en utilisant la fonction random() pour choisir les lignes renvoyĂ©es, alors que system et bernoulli se basent sur les mĂ©thodes TABLESAMPLE natives du mĂȘme nom. random fonctionne sur toutes les versions de serveur distant, alors que TABLESAMPLE n'est acceptĂ© qu'Ă  partir de la version 9.5. auto (la valeur par dĂ©faut) sĂ©lectionne l'Ă©chantillonnage recommandĂ©e automatiquement ; actuellement, cela signifie soit bernoulli soit random suivant la version du serveur distant.

F.38.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 (string)

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 (integer)

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.

batch_size (integer)

Cette option spécifie le nombre de lignes que postgres_fdw doit insérer à chaque opération d'insertion. Elle est disponible au niveau serveur et/ou table distante. L'option spécifiée sur une table surcharge celle spécifiée sur le serveur. La valeur par défaut est 1.

Notez que le nombre rĂ©el de lignes qu'insĂšre postgres_fdw en une fois dĂ©pend du nombre de colonnes et de la valeur fournie pour batch_size. Le batch est exĂ©cutĂ© comme une seule requĂȘte, et le protocole libpq (qu'utilise postgres_fdw pour se connecter au serveur distant) limitent le nombre de paramĂštres dans une seule requĂȘte Ă  65535. Quand le nombre de colonne * batch_size dĂ©passe la limite, le paramĂštre batch_size sera ajustĂ© pour Ă©viter une erreur.

Cette option s'applique aussi lors de la copie dans des tables distantes. Dans ce cas, le nombre réel de lignes que postgres_fdw copie à la fois est déterminé d'une façon similaire au cas de l'insertion, mais c'est limité à au plus 1000 du fait des restrictions d'implémentation de la commande COPY.

F.38.1.5. Options d'exĂ©cution asynchrone #

postgres_fdw supporte les exĂ©cutions asynchrones, qui exĂ©cutent plusieurs parties d'un nƓud Append de maniĂšre concurrente plutĂŽt qu'en sĂ©rie pour amĂ©liorer les performances. L'exĂ©cution peut ĂȘtre contrĂŽlĂ©e en utilisant l'option suivante :

async_capable (boolean)

Cette option contrÎle si postgres_fdw permet de parcourir de maniÚre concurrente les tables distantes pour les exécutions asynchrones. Elle est configurable au niveau du serveur distant et/ou de la table distante. L'option spécifiée au niveau table surcharge l'option au niveau serveur. La valeur par défaut est false.

Pour s'assurer que les donnĂ©es retournĂ©es depuis un serveur distant sont cohĂ©rentes, postgres_fdw n'ouvrira qu'une seule connexion pour un serveur distant et exĂ©cutera les requĂȘtes sur ce serveur sĂ©quentiellement mĂȘme si de nombreuses tables distantes sont impliquĂ©es, sauf si ces tables sont sujettes Ă  diffĂ©rentes correspondances d'utilisateur. Dans ce cas, il peut ĂȘtre plus performant de dĂ©sactiver cette option pour Ă©liminer la surcharge associĂ©e Ă  l'exĂ©cution asynchrone des requĂȘtes.

Une exĂ©cution asynchrone est rĂ©alisĂ©e quand un nƓud Append contient aussi bien un ou des sous-plans exĂ©cutĂ©s de maniĂšre synchrone que un ou des sous-plans exĂ©cutĂ©s de maniĂšre asynchrone. Dans un tel cas, si les sous-plans asynchones sont ceux traitĂ©s par postgres_fdw, les lignes des sous-plans asynchrones ne sont pas retournĂ©s avant qu'au moins un sous-plan synchrone retourne toutes ses lignes, car ce sous-plan est exĂ©cutĂ© pendant que les sous-plans aynchrones attendent les rĂ©sultats des requĂȘtes asynchrones envoyĂ©es au serveur distant. Ce comportement pourrait changer dans une version future.

F.38.1.6. Options de gestion de la transaction #

Comme dĂ©crit dans la section sur la gestion des transactions, avec postgres_fdw, les transactions sont gĂ©rĂ©es en crĂ©ant des transactions distantes correspondantes et les sous-transactions sont gĂ©rĂ©es par la crĂ©ation de sous-transactions distantes correspondantes. Lorsque plusieurs transactions distantes sont impliquĂ©es dans la transaction locale courante, par dĂ©faut, postgres_fdw valide ou annule les transactions distantes en sĂ©rie quand la transaction locale est validĂ©e ou annulĂ©e. Lorsque plusieurs sous-transactions distantes sont impliquĂ©es dans la sous-transaction locale courante, par dĂ©faut, postgres_fdw valide ou annule ces sous-transactions distantes en sĂ©rie quand la sous-transaction locale est validĂ©e ou annulĂ©e. Les performances peuvent ĂȘtre amĂ©liorĂ©es avec les options suivantes :

parallel_commit (boolean)

Cette option contrĂŽle si postgres_fdw valide en parallĂšle des transactions distantes ouvertes Ă  partir d'un serveur distant dans une transaction locale quand la transaction locale est validĂ©e. Ce paramĂštre s'applique aussi aux sous-transactions locales et distantes. Cette option peut seulement ĂȘtre donnĂ©es aux serveurs distants, et non pas par table. La valeur par dĂ©faut est false.

parallel_abort (boolean)

Cette option contrĂŽle si postgres_fdw annule, en parallĂšle, des transactions distantes ouvertes sur un serveur distant dans une transaction locale quand la transaction locale est annulĂ©e. Cette configuration s'applique aussi aux sous-transactions distantes et locales. Cette option peut seulement ĂȘtre indiquĂ©e pour les serveurs distants, et non par table. La valeur par dĂ©faut est false.

Si plusieurs serveurs distants avec ces options activées sont impliqués dans une transaction locale, plusieurs transactions distantes sur ces serveurs distants sont validées ou annulées en parallÚle à travers ces serveurs distants quand la transaction locale est validée ou annulée.

Quand ces options sont activées, un serveur distant avec plusieurs transactions distantes pourrait voir un impact négatif sur les performances quand la transaction locale est validée ou annulée.

F.38.1.7. 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 (boolean)

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.38.1.8. Options de troncabilitĂ© #

Par dĂ©faut, toutes les tables distantes utilisant postgres_fdw sont considĂ©rĂ©es comme troncable. Ceci peut ĂȘtre surchargĂ© en utilisant l'option suivante :

truncatable (boolean)

Cette option contrĂŽle si postgres_fdw permet aux tables distantes d'ĂȘtre tronquĂ©es en utilisant la commande TRUNCATE. Elle est disponible au niveau du server distant ainsi qu'Ă  celui de la table distante. L'option au niveau table surcharge l'option au niveau serveur. La valeur par dĂ©faut est true.

Bien sĂ»r, si la table distante n'est en fait pas troncable, une erreur se produira de toute façon. L'utilisation principale de cette option permet que l'erreur soit dĂ©clenchĂ©e localement sans requĂȘter le serveur distant.

F.38.1.9. 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 (boolean)

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 rĂ©el que les collations importĂ©es dans colonnes de la table ne correspondent pas aux donnĂ©es sous-jacentes, rĂ©sultant en un comportement anormal des requĂȘtes.

MĂȘme quand ce paramĂštre est configurĂ© Ă  true, l'import des colonnes dont la collation est la valeur par dĂ©faut du serveur distant peut ĂȘre risquĂ©. Elles seront importĂ©es avec COLLATE "default", ce qui sĂ©lectionnera la collation par dĂ©faut du serveur local, qui pourrait ĂȘtre diffĂ©rent.

import_default (boolean)

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 (boolean)

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 (boolean)

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 imported only when they are explicitly specified in LIMIT TO clause. Otherwise they are automatically excluded from IMPORT FOREIGN SCHEMA. Since all data can be accessed through the partitioned table which is the root of the partitioning hierarchy, importing only partitioned tables should allow access to all the data without creating extra objects.

F.38.1.10. Options de gestion de connexions #

Par défaut, toutes les connexions que postgres_fdw établit au serveur distant sont conservées ouvertes en session locale pour une réutilisation.

keep_connections (boolean)

Cette option contrĂŽle si postgres_fdw conserve les connexions au serveur distant ouvertes, permettant aux requĂȘtes ultĂ©rieures de les rĂ©utiliser. Elle n'est disponible qu'au niveau serveur distant. La valeur par dĂ©faut est on. Si elle est configurĂ©e Ă  off, toutes les connexions Ă  ce serveur distant seront supprimĂ©es Ă  la fin de chaque transaction.

F.38.2. Fonctions #

postgres_fdw_get_connections(OUT server_name text, OUT valid boolean) retourne un setof record

Cette fonction renvoie les noms des serveurs distants de toutes les connexions ouvertes que postgres_fdw a Ă©tablies. Elle renvoie aussi la validitĂ© ou non de chaque connexion. false est retournĂ© si la connexion au serveur distant est utilisĂ© dans la transaction courante locale sauf si le serveur distant ou les correspondances d'utilisateur sont modifiĂ©es ou supprimĂ©es(notez que le nom de serveur d'une connexion invalide sera NULL si le serveur est supprimĂ©), et ainsi de telles connexions invalides seront fermĂ©es Ă  la fin de cette transaction. true est retournĂ©e dans les autres cas. S'il n'y a pas de connexions ouvertes, aucun enregistrement n'est retournĂ©. Exemple d'utilisation de cette fonction :

postgres=# SELECT * FROM postgres_fdw_get_connections() ORDER BY 1;

 server_name | valid
-------------+-------
 loopback1   | t
 loopback2   | f

postgres_fdw_disconnect(server_name text) retourne un boolean

Cette fonction supprime les connexions ouvertes qui sont Ă©tablies par postgres_fdw depuis une session locale Ă  un serveur distant avec un nom donnĂ©. Notez qu'il peut y avoir de multiples connexions au serveur distant donnĂ© en utilisant diffĂ©rentes correspondances d'utilisateur. Si les connexions sont utilisĂ©es dans la transaction courante locale, elles ne sont pas dĂ©connectĂ©es et des messages d'alerte sont affichĂ©s. La fonction retourne true si elle dĂ©connecte au moins une connexion, sinon false. Si aucun serveur distant avec un nom donnĂ© n'est trouvĂ©, une erreur est affichĂ©e. Exemple d'utilisation de la fonction :

postgres=# SELECT postgres_fdw_disconnect('loopback1');

 postgres_fdw_disconnect
-------------------------
 t

postgres_fdw_disconnect_all() retourne un boolean

La fonction supprime toutes les connexions ouvertes Ă©tablies par postgres_fdw depuis la session locale au serveur distant. Si les connexions sont utilisĂ©es dans la transaction locale courante, elles ne sont pas dĂ©connectĂ©es et des messages d'alerte sont affichĂ©s. La fonction retourne true si elle dĂ©connecte au moins une connexion, sinon false. Exemple d'utilisation de la fonction :

postgres=# SELECT postgres_fdw_disconnect_all();

 postgres_fdw_disconnect_all
-----------------------------
 t

F.38.3. 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. Par dĂ©faut cette connexion est conservĂ©e et rĂ©-utilisĂ©e pour les requĂȘtes suivantes dans la mĂȘme session. Ce comportement peut ĂȘtre contrĂŽlĂ© en utilisant l'option keep_connections pour un serveur distant. Si plusieurs correspondances d'utilisateur sont utilisĂ©es pour accĂ©der au serveur distant, une connexion est Ă©tablie pour chaque correspondance d'utilisateur.

Lors de changement de la dĂ©finition ou suppression d'un serveur distant ou de correspondances d'utilisateur, les connexions associĂ©es sont fermĂ©es. Mais notez que si des connexions sont utilisĂ©es dans la transaction locale courante, elles sont conservĂ©es jusqu'Ă  la fin de transaction. Les connexions fermĂ©es seront rĂ©-Ă©tablies quand cela sera nĂ©cessaire par les futures requĂȘtes utilisant une table distante.

Une fois qu'une connexion Ă  un serveur distant a Ă©tĂ© Ă©tablie, elle est par dĂ©faut conservĂ©e jusqu'Ă  ce que la session locale ou distante correspondante termine. Pour dĂ©connecter une connexion explicitement, l'option keep_connections pour un serveur distant peut ĂȘtre dĂ©sactivĂ©e. Il est possible aussi d'utiliser les fonctions postgres_fdw_disconnect et postgres_fdw_disconnect_all. Par exemple, ces derniĂšres sont utiles pour fermer les connexions qui ne sont plus nĂ©cessaires, libĂ©rant ainsi les connexions sur le serveur distant.

F.38.4. 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.38.5. 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.38.6. 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.38.7. 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.38.8. ParamĂštres de configuration #

postgres_fdw.application_name (string) #

Donne une valeur pour le paramÚtre de configuration application_name utilisé quand postgres_fdw établie une connexion vers un serveur distant. Elle surcharge l'option application_name de l'objet serveur. Notez que la modification de ce paramÚtre n'affecte pas les connexions existantes jusqu'à ce qu'elles soient ré-établies.

postgres_fdw.application_name peut ĂȘtre toute chaĂźne, quelque soit sa longueur, et peut mĂȘme contenir des caractĂšres non ASCII. NĂ©anmoins, quand il est passĂ© et utilisĂ© comme dans un serveur distant, notez qu'il sera tronquĂ© Ă  moins que NAMEDATALEN caractĂšres. Tout caractĂšre autre que les caractĂšres ASCII affichables sera remplacĂ© par des Ă©chappements hexadĂ©cimaux du style langage C. Voir application_name pour les dĂ©tails.

Le caractĂšre % commence une « sĂ©quence d'Ă©chappement Â» qui est remplacĂ© par une information de statut comme indiquĂ© ci-dessous. Les Ă©chappements non reconnus sont ignorĂ©s. Les autres caractĂšres sont recopiĂ©s directement dans le nom de l'application. Notez qu'il n'est pas autorisĂ© d'indiquer un signe plus/moins ou un littĂ©ral numĂ©rique aprĂšs le % et avant l'option, pour de l'alignement ou du remplissage.

ÉchappementEffet
%aNom de l'application sur le serveur local
%c Identifiant de session sur le serveur local (voir log_line_prefix pour plus de détails)
%C Nom de l'instance sur le serveur local (voir cluster_name pour plus de détails)
%uNom de l'utilisateur sur le serveur local
%dNom de la base sur le serveur local
%pIdentifiant du processus sur le serveur local
%%CaractĂšre %

Par exemple, supposons que l'utilisateur local_user établisse une connexion à partir de la base local_db vers foreign_db en tant qu'utilisateur foreign_user, la configuration 'db=%d, user=%u' est remplacée par 'db=local_db, user=local_user'.

F.38.9. 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.38.10. Auteur #

Shigeru Hanada