Vous n'êtes pas identifié(e).
Bonjour à tous,
dans le cadre d'un projet je suis confronté à la problématique suivante :
j'ai une application 1 qui utilise une base postgres (base N°1) et qui la gestion de fichier (ces fichier sont stocké en base dans un champ de type oid). Je ne maîtrise ni le code de l'application, ni la structure de la base (j'y ai accès uniquement en lecture). cette application est sur un serveur Tomcat.
J'ai une application 2 qui utilise une base postgres (base N°2) et qui permet d'intégrer (un ou plusieurs) fichier(s) contenu dans la base N°1. C'est une application Access qui se trouve sur un espace réseau partagé.
Découvrant les champs de type oid, je me tourne vers vous afin de connaitre les différentes options qui s'offre a moi pour récupérer le fichier coté client.
L'idéal serait que mon application Access lance une commande qui récupérait le fichier contenu dans la base N°1 sur l'espace réseau partagé, pour que par la suite je puisse avec mon ETL (Talend) lire se fichier et intégrer les données dans la base N°2.
Merci par avance
n'hésitez pas si vous trouvez que mon explication n'est pas claire, ou si vous avez besoin d'informations supplémentaires
cordialement
Shishi
Bonjour,
Pour ma part en créant la foreign table je spécifie dans quel schéma la table distante se situe, de plus assure toi que l'utilisateur local avec lequel tu exécuté la requête sur La foreigner table à les droits sur le schéma et La foreign table. Et de plus il faut que l'utilisateur distant ai les droits sur La table et le schéma distant.
Cordialement
Shishi
Bonjour,
pour ma part j'ai utilisé les fdw uniquement entre 2 bases postgres sur des serveurs differents donc je ne sais pas si cela peut t'aiguiller mais j'ai commencé par créer l'extension ensuite il faut créer un foreign server avec une commande de ce style :
create server nom_foreign server
foreign data wrapper postgres_fdw
options (dbname 'nom_bdd', port '5432', host 'IP server distant ');
ensuite il faut créer un user mapping avec ce genre de commande :
create user mapping for nom_user
server nom_foreign_server
options (user 'nom_user_distant', password 'password');
et pour finir il faut créer un foreign table avec ce code
create foreign table nom_foreign_table (
idgenre integer not null,
nom character varying(50) not null,
)server nom_foreign_server options (schema_name 'public', table_name 'genre');
En espérant que cela t'aide un petit peu
Cordialement
Shishi
En plein dans le mille... la commande à résolu le problème encore merci Julien pour le temps passé à comprendre et à résoudre mon problème.
Bonne continuation
Cordialement
Shishi
l'erreur est exactement la même que dans mon premier message :
Redirecting to /bin/systemctl start postgresql-9.5.service
Job for postgresql-9.5.service failed because the control process exited with error code. See "systemctl status postgresql-9.5.service" and "journalctl -xe" for details.
et la commande ls -al /data/pgsql/ donne le résultat suivant :
drwxr-xr-x 4 root root 4096 26 févr. 2016 .
drwxr-xr-x 4 root root 4096 26 févr. 2016 ..
drwxr-xr-x 20 postgres postgres 4096 16 févr. 16:58 donnees
drwxr-xr-x 6 root root 4096 28 nov. 11:34 scripts
Encore merci de tenter de résoudre mon problème.
donc voici ce que j'ai fais, j'ai mis l'utilisateur postgres (qui existait déjà) comme groupe et propriétaire du dossier /data/pgsql/donnees et de tous ses sous-dossier et fichiers.
Mais malgrés ça toujours la même erreur.
justement comment rectifier le problème avez vous une idée?
C'est un VM locale donc je la démarre et comme je suis le seul dessus je me connecte avec le compte root et normalement le service postgres démarre tout seul or la rien a faire, alors que tout fonctionné trés bien avant.
D'abord merci pour votre réponse.
le propriétaire du dossier /data/pgsql/donnees est root [0]
et je suis connecté en root pour démarrer le service.
Bonjour à tous,
j'ai une installation de postgres 9.5 sur une machine centos 7 qui tournait parfaitement, aujourd'hui je me retrouve ce problème :
je lance la commande suivante :
service postgresql-9.5 start
j'obtiens la réponse suivante :
Redirecting to /bin/systemctl start postgresql-9.5.service
Job for postgresql-9.5.service failed because the control process exited with error code. See "systemctl status postgresql-9.5.service" and "journalctl -xe" for details.
et lorsque je lance la commande :
systemctl status postgresql-9.5.service
j'obtiens :
â postgresql-9.5.service - PostgreSQL 9.5 database server
Loaded: loaded (/usr/lib/systemd/system/postgresql-9.5.service; enabled; vendor preset: disabled)
Active: failed (Result: exit-code) since ven. 2017-02-17 12:43:23 CET; 38s ago
Process: 21914 ExecStart=/usr/pgsql-9.5/bin/pg_ctl start -D ${PGDATA} -s -w -t 300 (code=exited, status=1/FAILURE)
Process: 21909 ExecStartPre=/usr/pgsql-9.5/bin/postgresql95-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
févr. 17 12:43:22 pg-95-preprod-local.nancy.inra.fr systemd[1]: Starting PostgreSQL 9.5 database server...
févr. 17 12:43:22 pg-95-preprod-local.nancy.inra.fr pg_ctl[21914]: < 2017-02-17 12:43:22.647 CET >FATAL: le répertoire des données « /data/pgsql/donnees » a un mauvais propriétaire
févr. 17 12:43:22 pg-95-preprod-local.nancy.inra.fr pg_ctl[21914]: < 2017-02-17 12:43:22.647 CET >ASTUCE : Le serveur doit être en cours d'exécution par l'utilisateur qui possède le
févr. 17 12:43:22 pg-95-preprod-local.nancy.inra.fr pg_ctl[21914]: répertoire des données.
févr. 17 12:43:23 pg-95-preprod-local.nancy.inra.fr systemd[1]: postgresql-9.5.service: control process exited, code=exited status=1
févr. 17 12:43:23 pg-95-preprod-local.nancy.inra.fr systemd[1]: Failed to start PostgreSQL 9.5 database server.
févr. 17 12:43:23 pg-95-preprod-local.nancy.inra.fr systemd[1]: Unit postgresql-9.5.service entered failed state.
févr. 17 12:43:23 pg-95-preprod-local.nancy.inra.fr systemd[1]: postgresql-9.5.service failed.
je ne vois pas du tout d'où peut venir le problème, car je n'ai jamais changé le propriétaire du dossier /data/psql/données.
Auriez vous une piste afin de m'aider a régler mon soucis?
Merci par avance
Cordialement
Shishi
Bonjour,
je me doutais bien et rajouter un user mapping ce n'est pas la fin du monde, en tout car merci à tous les 2 pour votre aide.
Cordialement
Shishi
Par exemple dire a la vue de s’exécuter avec les privilège du rôle connecté ou une autre solution.
A priori j'ai bien peur que non mais bon je ne suis pas expert donc je demande.
Bonsoir,
merci pour votre réponse mais avec l'aide d'Eric et en testant on avait finit par le comprendre.
La question maintenant existe t-il un moyen de changer le comportement d'une vue?
Cordialement
Sébastien
C'est bien ce que je me disais après mes différents test et cela parait logique car selon moi une vue sert entre autre a montrer des donnée a des utilisateurs qui n'ont pas de privilège sur la table, la solution pour laquelle j'ai opté c'est de fournir un user mapping au rôle symphonie sur le foreign server et du coup tout fonctionne car j'avais pensé a votre solution mais j'aimerais bien que dans la boite pour laquelle je travaille on essaye de conserver le même propriétaire pour tous les objet de chaque base.
En attendant d'avoir l'avis d'utilisateurs plus expérimentés afin de savoir si il y a des solutions alternatives.
Merci pour le lien vers la doc je ne l'avais pas vu
Si c'est le cas automatiquement c'est bizarre en effet, je pensais que l'on pouvait faire comme avec les procédure stocké, définir les privilèges utilisés.
pour info la version de postgres et la 9.4
En tout cas merci Eric pour ta patience
j'ai fait les test et lorsque je met symphonie_app en tant que propriétaire sur la vue le select renvoie bien les données, de plus si je définis un user mapping pour le rôle symphonie (le proprietaire de la vue) le select me renvoie également les donnée.
C'est pour cela que je pense que lorsque je fais le select sur la vue, il prend le rôle propriétaire et cherche le user mapping sur le foreign server et comme le rôle symphonie n'a pas de user mapping il dit qu'i lne trouve pas la correspondance.
Mais existe t-il un moyen pour dire a la vue d'utiliser les privilèges du rôle connecté et non celui du propriétaire de la vue?
en ce qui concerne le schéma c'est une erreur de ma part (j'avais enlever et changé certain nom de groupe et de table ou colonne pour que cela paraisse plus simple mais apparement non lol)
je vous fournis le script complet :
\set proprietaire 'symphonie'
\set grpecriture 'symphonie_ecriture'
\set grplecture 'symphonie_lecture'
\set grpapp 'symphonie_app'
SET client_encoding = 'UTF8';
SET check_function_bodies = false;
SET client_min_messages = warning;
SET search_path = public, pg_catalog;
SET default_tablespace = '';
-- L'utilisation d'une transaction permet de créer toute la structure ou rien si une erreur survient, laissant la base de données dans un état stable
START TRANSACTION;
CREATE ROLE symphonie_app
WITH
LOGIN
ENCRYPTED PASSWORD 'mdp'
INHERIT
IN GROUP :grpecriture, :grplecture;
CREATE SCHEMA symphonie;
ALTER SCHEMA symphonie OWNER TO :proprietaire;
GRANT USAGE ON SCHEMA symphonie TO :grplecture;
GRANT CREATE ON SCHEMA symphonie TO :grpecriture WITH GRANT OPTION;
create extension postgres_fdw;
CREATE SERVER SERVER_SAMPLES
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (dbname 'SAMPLES', port '5432', host 'xxx.xxx.xxx.xxx ');
CREATE USER MAPPING for :grpapp
SERVER SERVER_SAMPLES
OPTIONS (user 'symphonie_samples', password 'mdp1');
CREATE FOREIGN TABLE symphonie.TF_SAMPLES_SAMPLE_SAM
(
SAMPLE_ID VARCHAR(5) not null,
BARCODE_FID INT4 not null,
SAMPLE_OPERATOR_FID INT4 null,
PROJECT_FID INT4 null,
TEAM_FID INT4 null,
PAPER_FID INT4 null,
SAMPLE_NAME VARCHAR(50) null,
NATURE_ENTITY VARCHAR(100) null,
DESTROYED BOOL not null,
QUANTITY REAL null,
QUANTITY_USE REAL null,
SAMPLE_UNIT VARCHAR(100) null,
COUNT_ENTITY VARCHAR(100) null,
ORIGIN_FID INT4 null,
GENETIC_CODE VARCHAR(25) null,
IS_GM BOOL not null,
INFO_IS_GM TEXT null,
AGE INT4 null,
AGE_UNIT VARCHAR(100) null,
CONDITIONING VARCHAR(100) null,
CONDITIONING_STATE VARCHAR(100) null,
DATE_CREATION DATE null,
COMMENT TEXT null,
STORAGE_PLACE_FID INT4 null,
STORE_KEEPER_FID INT4 null,
DATE_STORAGE DATE null,
COMMENT_STORAGE TEXT null
)
SERVER SERVER_SAMPLES OPTIONS (schema_name 'data', table_name 'sample');
ALTER FOREIGN TABLE symphonie.TF_SAMPLES_SAMPLE_SAM OWNER TO :proprietaire;
GRANT SELECT ON symphonie.TF_SAMPLES_SAMPLE_SAM TO :grplecture;
-- vue sur les échantillons (sample)
CREATE VIEW symphonie.VF_SAMPLES_VSAM AS
SELECT
SAMPLE_ID
FROM
symphonie.TF_SAMPLES_SAMPLE_SAM AS SAM;
ALTER VIEW symphonie.VF_SAMPLES_VSAM OWNER TO :proprietaire;
GRANT SELECT ON symphonie.VF_SAMPLES_VSAM TO :grplecture;
COMMIT -- Enregistre la totalité du traitement si aucune erreur n'est survenue
Avec ce script (et en étant connécté avec le rôle symphonie_app) j'obtiens bien les données en faisant un select sur ma foreign table mais sur la vue j'obtiens l'erreur.
Tout d'abord je confirme qu'un select sur la table étrangère ramène bien les données alors que sur la vue j'obtiens l'erreur, concernant le schéma symphonie toutes mes tables et vue sont dans un schéma appelé symphonie avec les droits pour les utilisateurs (donc le soucis ne viens pas de la).
le \dp sur la table tf_test_tes donne ceci :
db_symphonie=> \dp tf_test_tes
Access privileges
Schema | Name | Type | Access privileges
| Column access privileges
-----------+-----------------------+---------------+----------------------------
---+--------------------------
proprietaire | tf_test_tes | foreign table | proprietaire=arwdDxt/proprietaire
+|
| | | user_app=r/proprietaire+|
|
le \dp sur la vue vf_test_tes (avec un compte proprietaire) donne :
db_symphonie=# \dp vf_test_tes
Access privileges
Schema | Name | Type | Access privileges | Column access privileges
-----------+-----------------+------+-------------------------------+--------------------------
symphonie | vf_test_tes | view | proprietaire=arwdDxt/proprietaire +|
| | | user_app=r/proprietaire |
(1 row)
\dv vf_test_tes donne :
db_symphonie=> \dv vf_test_tes
List of relations
Schema | Name | Type | Owner
-----------+-----------------+------+-----------
symphonie | vf_test_tes | view | proprietaire
(1 row)
La vue est définie comme ceci :
CREATE VIEW symphonie.VF_TEST_TES AS
SELECT
ID,
CODE,
TYPE,
NAME,
FROM
symphonie.TF_TEST_TES;
ALTER VIEW symphonie.VF_TEST_TES OWNER TO proprietaire;
GRANT SELECT ON symphonie.VF_TEST_TES TO user_app;
Pourriez vous m'expliquer ce que c'est la clause SECURITY DEFINER s'il vous plait?
j'ai executé la commande : GRANT SELECT ON tf_test_tes, vf_test_tes TO user_app;
j'ai bien obtenus GRANT sur la ligne dans dessous, puis le SELECT donne ceci :
db_symphonie=> SELECT id FROM vf_test_tes;
ERREUR: correspondance utilisateur non trouvée pour « proprietaire »
En tout cas merci pour votre aide
voici les résultat :
\des :
db_symphonie=# \des
List of foreign servers
Name | Owner | Foreign-data wrapper
----------------+----------+----------------------
server_test | postgres | postgres_fdw
(1 row)
\deu :
db_symphonie=# \deu
List of user mappings
Server | User name
----------------+---------------
server_test | user_app
(1 row)
\det :
db_symphonie=# \det
List of foreign tables
Schema | Table | Server
-----------+-------------------------+----------------
symphonie | tf_test_tes | server_test
(1 row)
\dp vf_test_tes :
db_symphonie=# \dp vf_test_tes
Access privileges
Schema | Name | Type | Access privileges | Column access privileges
--------+------+------+-------------------+--------------------------
(0 rows)
\dp tf_test_tes :
db_symphonie=# \dp tf_test_tes
Access privileges
Schema | Name | Type | Access privileges | Column access privileges
--------+------+------+-------------------+--------------------------
(0 rows)
SELECT session_user, current_user; :
db_symphonie=> SELECT session_user, current_user;
session_user | current_user
---------------+---------------
user_app | user_app
(1 row)
SELECT id FROM vf_test_tes LIMIT 1; :
db_symphonie=> SELECT id FROM vf_test_tes LIMIT 1;
ERREUR: correspondance utilisateur non trouvée pour « proprietaire »
Voila le "proprietaire" qui apparaît sur la dernière requête correspond au rôle propriétaire de la vue.
Bonjour a toutes et tous,
je reviens vers vous concernant mon problème de vue, après plusieurs tests je me suis aperçu que la vue s'exécutée comme si j'étais connectée avec le rôle proprietaire et non user_app (pourtant je me suis bien connecté avec le rôle user_app).
Et que de ce fait il fallait que le rôle proprietaire ait avoir les droits sur la ou les tables sur lesquelles la vue effectue sa requete (ce qui parait assez logique), or dans mon cas précis je ne fais aucun user mapping sur ma foreign table.
Je résume :
le user mapping sur le foreign server et fait uniquement pour le rôle user_app,
la vue a comme propriétaire le rôle : proprietaire et du coup en faisant mon select sur ma vue (celui-ci s’exécutant avec les droits du rôle propriétaire) du coup il se fait refouler par le foreign server ne trouvant pas de user mapping correspondant au rôle proprietaire.
Ma question est donc la suivante : Y aurait il un moyen pour dire a la vue de s'executer avec les droit du rôle connecté et non celui du propriétaire? Un peu comme pour les procedures stockée ou l'on peut définir le rôle utilisé pour l’exécuter.
Merci d'avance
Cordialement
Shishi
merci pour l'information en faite j'utilise pgadmin3 pour me connecter à une vm qui possède une version n9.4 de postgres donc la commande psql donne le résultat suivant :
Schema | Name | Type | Access privileges | Column access privileges
-----------+-----------------+------+--------------------------------------+--------------------------
public | vf_test_tes | view | proprietaire=arwdDxt/symphonie +|
| | | user_app=r/symphonie +|
donc apparemment le GRANT SELECT ON VF_TEST_TES est pris en compte
Encore merci pour tes suggestions
j'utilise pgAdmin 3 et j'effectue un clique droit puis afficher les données mais je viens de tester avec ces requêtes :
sur la foreign table : "select * from TF_TEST_TES" => je vois bien les données
sur la vue : "select * from VF_TEST_TES" => je ne vois pas les données
Je viens également de tester en attribuant comme propriétaire à la vue l'utilisateur user_app et la miracle j'arrive a afficher les données
Quelqu'un pourrait m'expliquer comment cela se fait que je doive absolument mettre user_app comme propriétaire?
PS : concernant le schéma "symphonie" j'ai oublié de l’effacer, je n'utilise que le schéma public, et concernant la colonne TYPE idem un oubli lors du copier/coller (car je ne voulais pas afficher toutes les colonnes ici afin d'éviter que le texte soit trop long.
Merci pour votre réponse voici plus d'informations :
voici le script :
create extension postgres_fdw;
CREATE SERVER SERVER_test
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (dbname 'test', port '5432', host 'xxx.xxx.xxx.xxx ');
CREATE USER MAPPING for user_app
SERVER SERVER_test
OPTIONS (user test', password 'msp');
CREATE FOREIGN TABLE TF_TEST_TES
(
id serial not null,
nom INT4 not null,
)
SERVER testOPTIONS (schema_name 'data', table_name 'test');
ALTER FOREIGN TABLE TF_TEST_TES OWNER TO proprietaire;
GRANT SELECT ON TF_TEST_TES TO user_app;
CREATE VIEW VF_TEST_TES AS
SELECT
id,
nom,
FROM
TF_TEST_TES;
ALTER VIEW VF_TEST_TES OWNER TO proprietaire;
GRANT SELECT ON VF_TEST_TES TO user_app;
je crois n'avoir rien oublié, il y a 2 role de connexion : "user_app" et "proprietaire"
Avec l'utilisateur "user_app" j'arrive a afficher les données directement de la foreign table, mais impossible a partir de la vue.
J'espère qu'il ne manque aucunes informations
Merci d'avance
Cordialement
Shishi
Bonjour a toutes et a tous,
je rencontre un problème avec les foreign data wrapper voici le contexte :
j'utilise la version 9.4 de postgres, j'ai créé un role de connexion applicatif en lui appliquant tous les droits.
Une fois ma foreign table créée en me connectant avec le compte applicatif j'arrive a accédé aux données.
Le problème survient quand j'essaye de créer une vue sur ma foreign table, la vue est bien présente mais impossible d'effectuer un select sur cette vue...
Quelqu'un aurait il une idée d'ou le problème peut venir?
Merci d'avance a toutes et a tous, si il vous manque des informations ou même un morceau de script n'hésitez pas.
Cordialement
Shishi