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é ?

#1 Mon 14 April 2025 15:37

LucieBdD
Juste Inscrit !
Date d'inscription: 14 Apr 2025
Messages: 2

PG 14 : Trigger qui modifie les données en entrée "before insert"

Bonjour,

Impossible de trouver la réponse à ma question sur le Net.

PostgreSQL 14 :

Liste des tables utiles à mon travail :

* t1 (chp1 integer, [...])
* t2 (chp2 PK, libelle varchar)
* GPKG (chp_gpkg varchar, [...])

J'ai une table vide t1 avec un champ "chp1" de type integer, et dont la clé étrangère fait référence à la clé primaire "chp2" d'une table de référence t2.
Je veux mettre à jour "chp1" à partir du champ "chp_gpkg" d'un GPKG et récupérer les valeurs non pas de "chp_gpkg", mais celles du "chp2" de la table t2 via une jointure du type "chp_gpkg = t2.libelle".

J'ai un peu tout tenté, mais je ne suis vraiment pas une experte des triggers.
Ça donnerait qqch du genre :

Code:

CREATE OR REPLACE FUNCTION myfunc()
RETURNS trigger
LANGUAGE plpgsql
AS $function$

BEGIN

          SELECT t2.chp2
          INTO NEW.chp1
          FROM t2
          WHERE t2.libelle = [b]NEW.chp1[/b]; -- comment appeler mes valeurs en entrée (input depuis le GPKG) dans mon script ? Est-ce que NEW.chp1 est correct??

    RETURN NEW;

   END;

$function$
;

CREATE TRIGGER tr_myfunc BEFORE INSERT ON t1
FOR EACH ROW EXECUTE FUNCTION myfunc()  ;

Rien à faire, quand j'essaye de faire même manuellement un :

Code:

INSERT INTO t1 (chp1)
VALUES ('blablabla');

PostgreSQL me renvoie une erreur comme quoi j'essaye d'insérer du varchar dans un champ de type integer, comme s'il ne prenait pas en compte mon trigger...

Une idée ?

Merci à vous.

Bien cordialement,

Lucie

Hors ligne

 

#2 Mon 14 April 2025 16:04

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1193

Re: PG 14 : Trigger qui modifie les données en entrée "before insert"

Le trigger intervient en amont de l'insertion (BEFORE), mais après votre commande, Il ne peut pas changer le type de t1.chp1 en fonction du trigger.

Je ne comprends pas trop votre besoin, est ce que le trigger ne devrait pas plutôt se déclencher quand vous ajouter des données dans votre table gpkg et ajouter la valeur chp2 dans t1 à chaque ajout ? Ou alors une fonction simple qui prends un libellé en entrée et mets à jour votre table t1 en sortie ? Une vue pourrait suffire, également, si vous n'avez pas a éditer t1 par la suite.

Qu'est ce que vous cherchez à accomplir d'un point de vue métier, sans parler de comment vous devez le réaliser ?

Hors ligne

 

#3 Tue 15 April 2025 08:40

LucieBdD
Juste Inscrit !
Date d'inscription: 14 Apr 2025
Messages: 2

Re: PG 14 : Trigger qui modifie les données en entrée "before insert"

Bonjour,

Je vous remercie pour votre retour.

ChatGPT a répondu partiellement à mon besoin, je n'étais pas si loin :

Code:

CREATE OR REPLACE FUNCTION eau_potable.f_materiau_convert()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$

DECLARE mapped_id INTEGER;

BEGIN
    
    SELECT mat.id_ref INTO mapped_id
    FROM eau_potable.tr_aep_branchement_materiau as mat
    WHERE mat.brch_mat = NEW.brch_mat;

    NEW.brch_mat := mapped_id::TEXT;

    RETURN NEW;

END;

$function$
;


DROP TRIGGER e_materiau_convert ON eau_potable.tog_aep_branchement ;
CREATE TRIGGER e_materiau_convert BEFORE INSERT OR UPDATE ON eau_potable.tog_aep_branchement
FOR EACH ROW EXECUTE FUNCTION eau_potable.f_materiau_convert()  ;

Avec les vrais noms de tables, je pense que vous comprendrez sur quoi je travaille wink
Je dois restructurer les données du service Eau et Assainissement (format GPKG) dans une base PostgreSQL, base PostgreSQL où les libellés et structures de tables ne sont pas les mêmes que dans les GPKG. J'ai créé un script Python qui me permet de faire ça automatiquement, mais je bloquais sur les champs des tables PG qui demandent à recevoir des identifiants de type INTEGER avec clé étrangère sur une table de référence alors que l'input depuis le GPKG est de type varchar.

J'aurais bien aimé que mon trigger me permette d'accepter directement des INTEGER au moment du INSERT INTO, mais j'ai l'impression que ce n'est pas possible.
Il faut donc que je transforme mon champ "brch_mat" (= chp1 dans mon premier post) en varchar, que j'insère les données de mon GPKG (le trigger les transforme en nombres mais de type varchar donc), puis que je re-transforme ma colonne "brch_mat" en INTEGER après coup pour ensuite pouvoir créer une clé étrangère qui fait le lien avec l'id_ref (= chp2 dans mon premier post) de ma table de référence.

Du coup je pense que j'ai résolu mon problème, merci !

Bonne journée.

Bien cordialement,

Lucie

Dernière modification par LucieBdD (Tue 15 April 2025 08:48)

Hors ligne

 

Pied de page des forums

Copyright Association GeoRezo