12 (tutoré) - Vue modifiable

Vous allez maintenant faire un exercice un peu plus compliqué (Vue modifiable avec l'utilisation de INSTEAD OF)

Question

Nous souhaitons gérer le positionnement des étiquettes de la table zonage et pouvoir adopter une étiquette personnalisée différente du libellé dans une nouvelle table zonage_etiq spécifique à cette fonctionnalité (pour ne pas mélanger les données de présentation des étiquettes dans les données attributaires de la table zonage).

Cette nouvelle table aura pour attributs :

  • gid : INTEGER (clef primaire)

  • libelle_etiq : TEXT

  • x_etiq : FLOAT

  • y_etiq : FLOAT

Un zonage pourra avoir de 0 à 1 étiquette.

L'objectif est de proposer à l'utilisateur une vue que l'on appellera vue_zonage sur laquelle il pourra modifier le libellé et la position des étiquettes et à l'aide de trigger sur cette vue d'intercepter l' événement UPDATE pour faire en réalité les modifications dans la table zonage_etiq.

1) Créer la table zonage_etiq dans le schema travail.

2) créer la vue vue_zonage par jointure avec les spécifications suivantes :

SI zonage_etiq.gid est NULL ALORS vue_zonage.libelle_etiq = zonage.libelle SINON vue_zonage.libelle_etiq = zonage_etiq.libelle_etiq

SI zonage_etiq.gid est NULL ALORS vue_zonage.x_etiq = « Coord X de centroide de zonage » SINON vue_zonage.x_etiq = zonage_etiq.x_etiq

SI zonage_etiq.gid est NULL ALORS vue_zonage.y_etiq = « Coord Y de centroide de zonage » SINON vue_zonage.y_etiq = zonage_etiq.y_etiq

3) Créer une fonction maj_zonage_etiq() qui réalise l'algorithme suivant :

SI OLD.gid « existait déjà dans la liste des » zonage_etiq.gid ALORS

--> « mettre à jour » zonage_etiq

-----> zonage.libelle_etiq avec le nouveau libelle en majuscule

-----> zonage.x_etiq avec le nouveau x_etiq

----->zonage.y_etiq avec le nouveau y_etiq

SINON

--> « insérer » dans zonage_etiq un nouvel enregistrement (avec les nouvelles valeurs)

4) créer le trigger sur la vue vue_zonage.

5) faire un essai en modification d'étiquette en ajoutant la vue vue_zonage au canva sous QGIS.

vérifier les attributs de la table :

paramétrer l'emplacement des étiquettes dans les propriétés en indiquant les champs x_etiq et y_etiq

étiqueter la couche avec libel_etiq

basculer en mode édition et personnaliser des étiquettes avec les boutons

enregistrer les modifications et vérifier le contenu de la table attributaire.

Écrire les différentes requêtes SQL dans un fichier texte :

  1. requête de création de la table zonage_etiq

  2. requête de création de la vue vue_zonage

  3. requête de création de la fonction maj_zonage_etiq

  4. requête de création du trigger

Important : On ne cherche pas ici à pouvoir faire de la création de nouvelles entités directement dans vue_zonage. C'est pourquoi on n'intercepte pas l’événement INSERT.

La création de nouvelles entités doit toujours se faire dans la couche zonage.

Remettre ce fichier texte à l'équipe de formation selon la modalité indiquée en début de formation.

Indice

Les spécifications de la jointure seront réalisées par utilisation de CASE WHEN... THEN ... ELSE dans la clause SELECT.

Indice

la fonction inclura un IF...THEN... ELSE... END IF. Le test portera sur le fait que OLD.gid (l'ancien gid avant modification) est ou non présent dans la liste des gid existants dans zonage_etiq.gid. Cette liste sera obtenue par SELECT gid FROM travail.zonage_etiq. Pour vérifier l'appartenance on utilisera donc le test.

IF OLD.gid IN (SELECT gid FROM travail.zonage_etiq)

Indice

Le trigger utilisera l'événement INSTEAD OF UPDATE