banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Wed 29 July 2015 14:56

legannec
Participant occasionnel
Lieu: Sainte-Marie-Aux-Mines
Date d'inscription: 8 Aug 2011
Messages: 39

Créer une vue entre deux base de données

Bonjour,

J'ai deux couches de vecteurs, l'une comprenant des polygones et l'autre des ponctuels, dans deux bases de données différentes sur PostgresQL.

1ère couche de Polygones : 'Parcelles' (dbname='CADASTRE')

2ème couche de Points : 'f_rit_regard' (dbname='RIT')

Il y a parfois un ponctuel compris dans le polygone et parfois plusieurs. Je cherche à créer une vue en sélectionnant de façon automatique par requête SQL les polygones qui contiennent plusieurs ponctuels.

Du coup, suite à une première discussion avec Mathieu du Topic Qgis, j'ai légèrement modifié la requête suivant

CREATE VIEW parcelles_a_plusieurs_regard AS
SELECT * FROM dblink('hostaddr=localhost port=5432 dbname=CADASTRE user=postgres password=monMP','SELECT Parcelles.id, count(f_rit_regard.id), parcelles.geom
FROM parcelles JOIN f_rit_regard ON st_intersects(parcelles.geom, f_rit_regard.geom)
HAVING  count(f_rit_regard.id)>1)')


La réponse :

ERREUR: une liste de définition de colonnes est requise pour les fonctions renvoyant
un « record »
État SQL :42601
Caractère : 66

Il me semble qu'il faut spécifier à la fin de la requête une structuration qui permette de récupérer les entités sélectionnés mais comme c'est ma première requête SQL, je ne suis sûr de rien et aurai vivement besoin d'un bon conseil.


legannec, Sigiste à la com'com du Val d'Argent

Hors ligne

 

#2 Wed 29 July 2015 16:38

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 Jan 2006
Messages: 1233
Site web

Re: Créer une vue entre deux base de données

Bonjour,

Avec dblink, vous devez décrire l'enregistrement qui sera retourné :

Code:

WITH parcelles AS (SELECT * FROM dblink('hostaddr=localhost port=5432 dbname=CADASTRE user=postgres password=monMP','SELECT id, parcelles.geom) parcelles (id integer, geom geometry(POLYGON,2154),
f_rit_regardAS  (SELECT * FROM dblink('hostaddr=localhost port=5432 dbname=CADASTRE user=postgres password=monMP','SELECT id, geom) f_rit_regard(id integer, geom geometry(POINT,2154)
SELECT parcelles.id, count(f_rit_regard.id), parcelles.geom
FROM parcelles JOIN f_rit_regardON st_intersects(parcelles.geom, f_rit_regard.geom)
HAVING  count(f_rit_regard.id)>1)')

Mathieu BOSSAERT
Association GeoRezo

Hors ligne

 

#3 Fri 31 July 2015 08:50

legannec
Participant occasionnel
Lieu: Sainte-Marie-Aux-Mines
Date d'inscription: 8 Aug 2011
Messages: 39

Re: Créer une vue entre deux base de données

Bonjour Mathieu,

J'ai essayé de bidouiller plusieurs éléments mais en vain,
j'obtiens ce résultat :

ERREUR:  erreur de syntaxe sur ou près de « hostaddr »
LINE 2: f_rit_regard AS  (SELECT * FROM dblink('hostaddr=localhost p...
                                                ^

********** Erreur **********

ERREUR: erreur de syntaxe sur ou près de « hostaddr »
État SQL :42601
Caractère : 236



Du coup, plusieurs questions :

Tout d'abord, au niveau de la forme, comment fait t-on pour incruster du code dans une page du forum ?
Ensuite, mes données sont stockées dans 2 bases différentes, dois-je modifier l'une des deux "dbname" ?
A quoi correspond "id", serait-ce la clé primaire des tables ou un nouveau champs créé suite à la requête ?
Et enfin à quoi correspond le "2154" après le type géométrique des entités ?


Cordialement,


legannec, Sigiste à la com'com du Val d'Argent

Hors ligne

 

#4 Fri 31 July 2015 09:21

jmarsac
Participant assidu
Lieu: NICE
Date d'inscription: 26 Oct 2005
Messages: 572
Site web

Re: Créer une vue entre deux base de données

Bonjour,

Sélectionnez la portion de code et cliquez sur le bouton Code

Pouvez-vous mettre la requête entière  ?

Dernière modification par jmarsac (Fri 31 July 2015 09:27)


Jean-Marie
Azimut

Hors ligne

 

#5 Fri 31 July 2015 10:40

legannec
Participant occasionnel
Lieu: Sainte-Marie-Aux-Mines
Date d'inscription: 8 Aug 2011
Messages: 39

Re: Créer une vue entre deux base de données

Bonjour jmarsac,

Voici le code :

Code:

WITH parcelles AS (
    SELECT * 
    FROM dblink('host=localhost port=5432 dbname=CADASTRE user=postgres password=mon_mot_de_passe','SELECT id, parcelles.geom) parcelles (id integer, geom geometry(POLYGON,2154),
 f_rit_regard AS (
    SELECT * 
    FROM dblink('host=localhost port=5432 dbname=CADASTRE user=postgres password=mon_mot_de_passe','SELECT id, geom) f_rit_regard (id integer, geom geometry(POINT,2154)

    SELECT parcelles.id, count(f_rit_regard.id), parcelles.geom 
    FROM parcelles JOIN f_rit_regard ON st_intersects(parcelles.geom, f_rit_regard.geom) HAVING  count(f_rit_regard.id)>1)')

legannec, Sigiste à la com'com du Val d'Argent

Hors ligne

 

#6 Fri 31 July 2015 11:43

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: Créer une vue entre deux base de données

Bonjour,

Puis-je vous demander pourquoi les données sont dans deux bases séparées ?

Je vois souvent, à l'occasion de formations, que la notion théorique de base de données (BD cadastre, BD référentiels ...) est traduite par la création de bases de données PostgreSQL différentes sur le meme serveur.
Il est souvent beaucoup plus intéressant de regrouper toutes les données travail (spatiales et non spatiales) au sein de la même base de donnée physique, en organisant les données en schémas.

C'est en général plus facile a administrer (sauvegardes, réplications, configuration d'une seule instance), plus performant et cela permet d'exploiter facilement TOUTES les données, en évitant justement de se connecter à plusieurs bases avec DBLink ou FDW. (Par exemple, si vous créez des fonctions SQL spécifiques pour vos besoins, il est plus intéressant de définir ces fonctions sur une seule base, en pouvant les utiliser avec toutes les données).

Les outils externes se connectant à PostgreSQL (qgis, mapserver, geoserver) sont également plus facile à configurer et ont a gérer moins de connexions à PostgreSQL.

Nicolas

Hors ligne

 

#7 Mon 03 August 2015 11:53

legannec
Participant occasionnel
Lieu: Sainte-Marie-Aux-Mines
Date d'inscription: 8 Aug 2011
Messages: 39

Re: Créer une vue entre deux base de données

Bonjour,

Effectivement, cela simplifierait les prochaines requêtes de constituer une seule BDD avec plusieurs schémas.

Par contre au niveau de l'administration, peut-on configurer un accès à la BDD selon les différents schémas ?

Pour l'instant, sur le réseau local j'ai l'utilisateur A qui ne peut se connecter qu'à la BDD 1 et l'utilisateur B, à la BDD 2.
Il faudrait donc que les utilisateurs puissent se connecter à une unique BDD avec cependant des contrôles d’accès vers le schéma 1 ou le schéma 2.

Cordialement


legannec, Sigiste à la com'com du Val d'Argent

Hors ligne

 

#8 Mon 03 August 2015 15:38

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: Créer une vue entre deux base de données

Bonjour,

Oui, la gestion des roles et des droits (commandes GRANT et REVOKE) vous permettre de donner les droits (lecture, écriture, connexion, etc.) que vous voulez sur les objets (schemas, tables, fonctions...) que vous voulez.

(http://www.postgresql.org/docs/current/ … manag.html)

Nicolas

Hors ligne

 

#9 Mon 10 August 2015 15:35

jmarsac
Participant assidu
Lieu: NICE
Date d'inscription: 26 Oct 2005
Messages: 572
Site web

Re: Créer une vue entre deux base de données

Bonjour,

legannec a écrit:

Bonjour jmarsac,

Voici le code :

Code:

WITH parcelles AS (
    SELECT * 
    FROM dblink('host=localhost port=5432 dbname=CADASTRE user=postgres password=mon_mot_de_passe','SELECT id, geom) parcelles (id integer, geom geometry(POLYGON,2154),
 f_rit_regard AS (
    SELECT * 
    FROM dblink('host=localhost port=5432 dbname=CADASTRE user=postgres password=mon_mot_de_passe','SELECT id, geom) f_rit_regard (id integer, geom geometry(POINT,2154)

    SELECT parcelles.id, count(f_rit_regard.id), parcelles.geom 
    FROM parcelles JOIN f_rit_regard ON st_intersects(parcelles.geom, f_rit_regard.geom) HAVING  count(f_rit_regard.id)>1)')


Pas le temps de tester, mais le code suivant devrait fonctionner en remplaçant t1 et t2 par le nom réel des tables concernées:

Code:

WITH
 parcelles AS (
    SELECT * 
    FROM dblink('host=localhost port=5432 dbname=CADASTRE user=postgres password=mon_mot_de_passe','SELECT id, parcelles.geom from t1') ),
 f_rit_regard AS (
    SELECT * 
    FROM dblink('host=localhost port=5432 dbname=CADASTRE user=postgres password=mon_mot_de_passe','SELECT id, geom from t2') )

    SELECT parcelles.id, count(f_rit_regard.id), parcelles.geom 
    FROM parcelles JOIN f_rit_regard ON st_intersects(parcelles.geom, f_rit_regard.geom) HAVING  count(f_rit_regard.id) > 1;

Dernière modification par jmarsac (Mon 10 August 2015 16:24)


Jean-Marie
Azimut

Hors ligne

 

Pied de page des forums

Powered by FluxBB