PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 Général » Récupérer le contenu d'un champ de type oid si possible coté client » 05/12/2017 15:32:44

shishi
Réponses : 1

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

#2 Re : Général » [RESOLU] Mise en place de Foreign Data Wrappers Oracle » 20/02/2017 10:01:03

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

#3 Re : Général » [RESOLU] Mise en place de Foreign Data Wrappers Oracle » 17/02/2017 16:30:17

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

#4 Re : Général » [résolu] Démarrage service postgres impossible » 17/02/2017 13:16:07

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

#5 Re : Général » [résolu] Démarrage service postgres impossible » 17/02/2017 13:10:15

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.

#6 Re : Général » [résolu] Démarrage service postgres impossible » 17/02/2017 12:56:23

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.

#7 Re : Général » [résolu] Démarrage service postgres impossible » 17/02/2017 12:45:11

justement comment rectifier le problème avez vous une idée?

#8 Re : Général » [résolu] Démarrage service postgres impossible » 17/02/2017 12:28:41

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.

#9 Re : Général » [résolu] Démarrage service postgres impossible » 17/02/2017 12:17:19

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.

#10 Général » [résolu] Démarrage service postgres impossible » 17/02/2017 12:06:43

shishi
Réponses : 12

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

#11 Re : Général » Ma vue sur une foreign table ne fonctionne pas » 10/02/2016 10:54:42

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

#12 Re : Général » Ma vue sur une foreign table ne fonctionne pas » 09/02/2016 23:48:11

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.

#13 Re : Général » Ma vue sur une foreign table ne fonctionne pas » 09/02/2016 00:11:31

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

#14 Re : Général » Ma vue sur une foreign table ne fonctionne pas » 08/02/2016 20:44:12

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

#15 Re : Général » Ma vue sur une foreign table ne fonctionne pas » 08/02/2016 17:57:57

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

#16 Re : Général » Ma vue sur une foreign table ne fonctionne pas » 08/02/2016 17:38:24

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?

#17 Re : Général » Ma vue sur une foreign table ne fonctionne pas » 08/02/2016 16:32:00

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.

#18 Re : Général » Ma vue sur une foreign table ne fonctionne pas » 08/02/2016 16:02:14

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?

#19 Re : Général » Ma vue sur une foreign table ne fonctionne pas » 08/02/2016 14:28:30

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

#20 Re : Général » Ma vue sur une foreign table ne fonctionne pas » 08/02/2016 12:24:50

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.

#21 Re : Général » Ma vue sur une foreign table ne fonctionne pas » 08/02/2016 11:01:57

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

#22 Re : Général » Ma vue sur une foreign table ne fonctionne pas » 05/02/2016 14:47:56

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

#23 Re : Général » Ma vue sur une foreign table ne fonctionne pas » 05/02/2016 13:06:59

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.

#24 Re : Général » Ma vue sur une foreign table ne fonctionne pas » 05/02/2016 12:08:21

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

#25 Général » Ma vue sur une foreign table ne fonctionne pas » 05/02/2016 11:15:15

shishi
Réponses : 27

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

Pied de page des forums

Propulsé par FluxBB