Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
Je commence à tester postgres_fdw pour connecter deux serveurs distants, dont les bases de données sont complémentaires.
Sur mon serveur1 (celui sur lequel je veux installer les tables distantes contenues physiquement dans le serveur2), j'ai un utilisateur user1 qui est membre d'un rôle serveur1_admin. Ce rôle possède tous les droits sur serveur1 (quasi super-user).
Voici ce que ça donne :
-------------------------------------------------------------------------------------
CREATE SERVER serv2 FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'serveur2', dbname 'base2', port '5432');
ALTER SERVER serv2 OWNER TO serveur1_admin;
-------------------------------------------------------------------------------------
Je crée un mapping utilisateur pour serveur1_admin sur mon serveur2 (en utilisant un utilisateur user2 qui a les droits de SELECT sur serveur2) :
-------------------------------------------------------------------------------------
CREATE USER MAPPING FOR serveur1_admin SERVER serv2 OPTIONS (user 'user2', password 'pwd2');
-------------------------------------------------------------------------------------
Je crée un nouveau schéma sur serveur1 pour recevoir les tables étrangères de serveur2 :
-------------------------------------------------------------------------------------
CREATE SCHEMA base2
AUTHORIZATION production_admin;
GRANT ALL ON SCHEMA base2 TO serveur1_admin;
GRANT USAGE ON SCHEMA base2 TO public;
-------------------------------------------------------------------------------------
Je crée une table étrangère sur serveur1 :
-------------------------------------------------------------------------------------
CREATE FOREIGN TABLE base2.matable
(
col1 INT NOT NULL,
col2 character varying(12),
col3 character varying(12),
col4 character varying(50)
)
SERVER serv2
OPTIONS (schema_name 'schema2', table_name 'matable_sur_serveur2');
ALTER FOREIGN TABLE base2.matable
OWNER TO serveur1_admin;
-------------------------------------------------------------------------------------
Maintenant, si je suis connecté comme user1, la requête sur la table distante échoue avec le message suivant :
ERROR: user mapping not found for "user1"
État SQL :42704
Cela signifie-t-il que si user1 est membre de serveur1_admin, qui a les droits pour interroger la table distante, je suis obligé de créer un mapping user pour chaque utilisateur membre de serveur1_admin ?
Ou bien est-ce que j'ai raté une étape ?
Ce qui est étonnant (quoi que), c'est qu'un user mapping avec PUBLIC fonctionne bien (mais c'est sans doute dû au caractère particulier du rôle PUBLIC) :
-------------------------------------------------------------------------------------
CREATE USER MAPPING FOR public SERVER serv2 OPTIONS (user 'user2', password 'pwd2');
-------------------------------------------------------------------------------------
Là, la requête sur la table étrangère renvoie un résultat conforme.
Merci d'avance pour votre aide,
ced
Hors ligne
Cela signifie-t-il que si user1 est membre de serveur1_admin, qui a les droits pour interroger la table distante, je suis obligé de créer un mapping user pour chaque utilisateur membre de serveur1_admin ?
Exact. Le mapping se fait pour l'utilisateur connecté.
Ce qui est étonnant (quoi que), c'est qu'un user mapping avec PUBLIC fonctionne bien (mais c'est sans doute dû au caractère particulier du rôle PUBLIC)
Vous avez compris. PUBLIC est très particulier, dans le sens où il englobe tout le monde et est non modifiable.
Guillaume.
Hors ligne
Je regretterais presque d'avoir compris... Ça va m'obliger à créer un mapping utilisateur par utilisateur réellement connecté, mais qu'à cela ne tienne.
Merci pour les confirmations.
Hors ligne
Pages : 1