Annexe B. Créer un modèle de base de données PostgreSQL contenant les fonctionnalités de PostGIS pour un utilisateur aux droits restreints sur une base

Table des matières

B.1. Création du modèle contenant les fonctionalités de PostGIS
B.2. Création de l'utilisateur et de la base de données
B.2.1. Création de l'utilisateur
B.2.2. Création de la base de données
B.2.3. Restriction des droits sur les tables geometry_columns et spatial_ref_sys
B.2.4. Vérification

Ce genre de spécifité fait partie du travail qui pourrait attendre un administrateur PostGIS dans un cadre bien particulier. Exposons donc ce dernier. Supposons que vous êtes administrateur. A chaqe utilisateur de la base correspond une base de données. Vous devez respecter les consigne suivantes que l'on vous demande

Voyons pour celà les diverses commandes à effectuer

B.1. Création du modèle contenant les fonctionalités de PostGIS

Ici nous appelerons le modèle template_gis. Celà commence donc par la création d'une base de données PostGIS. Connectez-vous donc en tant qu'administrateur (que nous appellerons ici postgres)

su postgres

Une fois connecté, nous créons notre base template_gis

createdb template_gis
createlang plpgsql template_gis
psql -d template_gis -f [chemin_d_acces_vers_lwpostgis.sql]
psql -d template_gis -f [chemin_d_acces_vers_spatial_ref_sys.sql]

Je fais exprès ici d'employyer [chemin_d_acces] afin d'éviter à distinguer Windows de GNU/Linux. On se connecte maintenant à la base en question pour prévenir PostgreSQL que la base que nous venons de créer est et sera à l'avenir un modèle de base de données (comme template1 par défaut)

psql template_gis

La requête est

UPDATE pg_database SET datistemplate='true' WHERE datname='template_gis';

B.2. Création de l'utilisateur et de la base de données

Nous allons ici appelé l'utilisateur jean et sa base meriim

B.2.1. Création de l'utilisateur

Pour créer l'utilisateur jean selon le cahier des charges attendu (droit de se connecter à une base de données, aura un mot de passe, simple utilisateur avec impossibilité de créer d'autre bases de données,impossibilité de créer d'autre rôles), nous ferons

#createuser -PRelSED jean
Entrez le mot de passe pour le nouvel rôle :
Entrez-le de nouveau :
CREATE ROLE jean ENCRYPTED PASSWORD 'jean' NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN;
CREATE ROLE

B.2.2. Création de la base de données

Pour créer la base de données, il suffira de faire

#createdb -O jean -T template_gis meriim

B.2.3. Restriction des droits sur les tables geometry_columns et spatial_ref_sys

Pour restreindre les droits sur ces tables à l'utilisateur jean, nous ferons depuis psql, les requêtes SQL suivantes

GRANT ALL ON geometry_columns TO jean;
GRANT SELECT ON spatial_ref_sys TO jean;

B.2.4. Vérification

Connectons-nous en tant que jean sur la base meriim

postgres@bremko:/root$ psql -U jean meriim
Bienvenue dans psql 8.1.5, l'interface interactive de PostgreSQL.

Tapez:  \copyright pour les termes de distribution
        \h pour l'aide-mémoire sur les commandes SQL
        \? pour l'aide-mémoire sur les commandes psql
        \g ou terminez avec un point-virgule pour exécuter une requête
        \q pour quitter

meriim=> select * from geometry_columns ;
 f_table_catalog | f_table_schema | f_table_name | f_geometry_column | coord_dimension | srid | type
-----------------+----------------+--------------+-------------------+-----------------+------+------
(0 lignes)

meriim=> \dt
               Liste des relations
 Schéma |       Nom        | Type  | Propriétaire
--------+------------------+-------+--------------
 public | geometry_columns | table | postgres
 public | spatial_ref_sys  | table | postgres
 public | test             | table | jean
(3 lignes)

Ok si j'essais maintenant sur une autre base existante igo

meriim=> \c igo
Vous êtes maintenant connecté à la base de données «igo».
igo=> \dt
                   Liste des relations
 Schéma  |          Nom           | Type  | Propriétaire
---------+------------------------+-------+---------------
 public  | 31_com_plus_hors_agglo | table | postgres
 public  | com_plus_hors_agglo    | table | postgres
 public  | geometry_columns       | table | postgres
 public  | ligne_tram_3           | table | postgres
 public  | spatial_ref_sys        | table | postgres
(5 lignes)

igo=>

Je peux donc me connecter à cette base (option -l de createuser que nous avons utilisié). Maintenant si j'essais de listé le contenu de la table

igo=> SELECT * FROM "31_com_plus_hors_agglo";
ERREUR:  droit refusé pour la relation 31_com_plus_hors_agglo
igo=>

Mais puis-je créer au moins des tables. Je vais essayer en important des Shapefiles

postgres@bremko:~/igo$ shp2pgsql -DI l3.shp ligne |psql -U jean meriim
Shapefile type: Arc
Postgis type: MULTILINESTRING[2]
BEGIN
INFO:  CREATE TABLE créera des séquences implicites «ligne_gid_seq» pour la colonne «serial» «ligne.gid»
INFO:  CREATE TABLE / PRIMARY KEY créera un index implicite «ligne_pkey» pour la table «ligne»
CREATE TABLE
                     addgeometrycolumn
-----------------------------------------------------------
 public.ligne.the_geom SRID:-1 TYPE:MULTILINESTRING DIMS:2

(1 ligne)

CREATE INDEX
COMMIT

Ok! Mais puis-je au moins comme attendu utiliser les fonctionnalités de PostGIS en tant qu'utilisateur jean?

meriim=> select geometrytype(the_geom),length(the_geom) from ligne;
  geometrytype   |      length
-----------------+------------------
 MULTILINESTRING | 19578.4949845822
(1 ligne)

meriim=> select postgis_full_version();
                               postgis_full_version
----------------------------------------------------------------------------------
 POSTGIS="1.1.6" GEOS="2.2.3-CAPI-1.1.1" PROJ="Rel. 4.5.0, 22 Oct 2006" USE_STATS
(1 ligne)

Ok donc tout est Ok!