Skip to content
Sylvain edited this page May 18, 2020 · 2 revisions

Plugin Historisation

Introduction

Le plugin Historisation a été élaboré par la société Arxit sur demande du SITN. Il est conçu pour fonctionner avec le couple Qgis (>=3.10) – PostgreSQL (>=4.0). Il est déposé sur GitHub.

Le plugin Historisation ne fait qu’historiser les données, il n’y a pas de routine pour une visualisation temporelle.

Définition des droits

L’administrateur de la base peut accorder les droits nécessaires au client afin que ce dernier puisse créer au travers de l’application Qgis les tables d’historisation ou non. Dans le cas du non, un « user » client doit être créé avec des droits minimums.

Fig.1

Au niveau du schéma, il faut définir la sécurité, ainsi que les privilèges par défaut.

Sécurité

Fig.2

Privilèges par défaut

Tables

Fig.3

Séquences

Fig.4

Fonctions

Fig.5

Types

Fig.6

Les droits des tables à historiser seront ainsi reportés automatiquement sur les tables historiques « *_h ».

Installation

Côté administrateur

Initialisation de la base de données et des tables

Modifiez le SEARCH_PATH qui correspond au schéma PostgreSQL où se trouve les tables que vous souhaitez historiser.

SET SEARCH_PATH = "the_schema";
/* Table creation */
CREATE TABLE histo_param
(
    id            BIGSERIAL PRIMARY KEY,
    nom_table     VARCHAR(50) NOT NULL,
    display_field VARCHAR(50) NOT NULL,
    id_field      VARCHAR(50) NOT NULL
);
CREATE UNIQUE INDEX histo_param_nom_table_uindex
    ON histo_param (nom_table);

CREATE TABLE histo_event_type
(
    id          SMALLINT PRIMARY KEY,
    description VARCHAR(500)
);

CREATE TABLE histo_event
(
    id          BIGSERIAL PRIMARY KEY,
    event_date  TIMESTAMP   NOT NULL,
    author      VARCHAR(50) NOT NULL,
    type_id     SMALLINT    NOT NULL REFERENCES histo_event_type (id),
    description VARCHAR(500)
);

/* Initial value insertion */
INSERT INTO histo_event_type (id, description)
VALUES (0, 'Initialisation');
-- Add other value

Exécutez ce premier script, modifiez également la deuxième valeur SEARCH_PATH et exécutez le deuxième script ci-dessous.

SET SEARCH_PATH = "the_schema";

CREATE OR REPLACE FUNCTION create_h_table(schema text, source_table text, geometry_field text,
                                          code_fields text[]) RETURNS BOOLEAN AS
$$
DECLARE
    h_table    text;
    code_field text;
BEGIN
    h_table := schema || '.' || source_table || '_h';
    EXECUTE 'CREATE TABLE ' || h_table || ' AS SELECT * FROM ' || schema || '.' || source_table;

    EXECUTE 'ALTER TABLE ' || h_table || ' ADD histo_id bigserial NOT NULL';
    EXECUTE 'ALTER TABLE ' || h_table || ' ADD start_date timestamp';
    EXECUTE 'ALTER TABLE ' || h_table || ' ADD end_date timestamp';
    EXECUTE 'ALTER TABLE ' || h_table || ' ADD start_event_id bigint';
    EXECUTE 'ALTER TABLE ' || h_table || ' ADD end_event_id bigint';

    FOREACH code_field IN ARRAY code_fields
        LOOP
            EXECUTE 'ALTER TABLE ' || h_table || ' ADD ' || code_field || '_desc varchar(100)';
        END LOOP;

    EXECUTE 'ALTER TABLE ' || h_table || ' ADD CONSTRAINT ' || source_table || '_h_pk PRIMARY KEY(histo_id)';

    IF geometry_field <> '' THEN
        EXECUTE 'CREATE INDEX ' || source_table || '_h_' || geometry_field || ' ON ' || h_table ||
                ' USING gist(' || geometry_field || ')';
    END IF;

    RETURN TRUE;
END ;
$$
    LANGUAGE PLPGSQL
    EXTERNAL SECURITY DEFINER;

L’initialisation de la base est terminée.

Trois tables de paramètres sont créées :

  1. histo_event_type contient les types d’événement à définir en collaboration avec le client. Par défaut le type « initialisation » est créé. Il sera utilisé lors de la création des tables « *_h »

  2. histo_param contient la liste des tables ainsi que les attributs libellé et id pour les tables à historiser. Elle sera renseignée lors de la création des tables « *_h »

  3. histo_event contient les événements déclencheur des modifications ainsi que l’auteur, la date et l’heure et le type. Elle est renseignée lors des enregistrements des tables de base.

Création des tables d’historisation « *_h »

Cette étape va créer les tables d’historisation « *_h ». Elles héritent de la même structure que celles de base et le plugin ajoute les attributs suivants :

  • histo_id bigint, sérial, clé primaire -> identifiant de l’objet historisé
  • start_date timestamp -> début de vie de l’objet
  • end_date timestamp -> fin de vie de l’objet
  • start_event_id -> événement de la création de l’objet
  • end_event_id -> événement de modification de l’objet

Si des attributs de la table de base sont définis dans Qgis comme « Liste de valeurs » ou « Valeur relationnelle » ils sont dupliqués et nommés « *_desc ». Ce dernier permet de conserver dans le temps la valeur d’une liste de choix en lieu et place de l’identifiant de cette valeur.

/!\ Attention les listes doivent être définies avant de créer les tables « *_h ».

/!\ Attention si on ajoute un attribut dans la table de base après la création de la table « *_h », il faut penser à l’ajouter également dans cette dernière de même s’il s’agit d’une liste, il faut en plus ajouter l’attribut « *_desc ».

  1. Ouvrir Qgis
  2. Installer le plugin Historisation contenu dans le dépôt du SITN fig.7
  3. Connecter la base PG avec les droits admin (create)
  4. Ouvrir les tables souhaitées
  5. Sélectionner la table à historiser
  6. Cliquer sur le bouton Fig.8
  7. Indiquer un champ libellé qui apparaitra lors des sauvegardes et l’identifiant unique de la table puis Valider

Fig.9

  1. Oui

Fig.10

  1. Reprendre au point 5 pour toutes les autres tables

Une fois fait vous pouvez effectuer les modifications désirées et enregistrer vos modifications qui seront historisées. La description de cette étape est disponible dans la partie « Côté client ».

Côté client

Pour que le plugin Historisation fonctionne, il est nécessaire que l’administrateur de la base ait initialisé l’historisation sur celle-ci auparavant et attribué les privilèges nécessaires à l’utilisateur « client ».

Installation du plugin

  1. Ouvrir Qgis
  2. Connecter la base avec les droits nécessaires (insert, update, delete)
  3. Ouvrir les tables souhaitées ou ouvrir le projet déjà existant
  4. Si ce n’est pas déjà le cas, Installer le plugin Historisation contenu dans le dépôt du SITN fig.7 ce bouton doit apparaître dans la barre d’outils Fig.8.

L’installation côté client est terminée.

Utilisation

  1. Effectuer les modifications souhaitées
  2. Enregistrer la couche comme d’habitude
  3. La fenêtre ci-dessous apparaît. La section « Propriété de la sélection » permet de modifier les informations.

Description des éléments

  1. Nom de la couche, l’identifiant de l’objet (pas encore attribué pour ajout)
  2. Le libellé afin de faciliter la reconnaissance de l’objet (définit par l’administrateur)
  3. Changement effectué
  4. Si l’objet doit se faire historisé ou non (expl : correction orthographique du contenu d’un attribut. La géométrie devrait toujours être historisée)
  5. Type de la démarche d’historisation (définit par l’administrateur)
  6. Description de la modification
  7. Les modifications sont à appliquer uniquement aux lignes sélectionnées ou à toutes les lignes
  8. Enregistre toutes les modifications

Fig.12

Lors du prochain enregistrement dans la même session Qgis, les mêmes informations sont reprises par défaut. Elles sont modifiables à souhait.