Pages: 1
- Sujet précédent - PG 14 : Trigger qui modifie les données en entrée "before insert" - Sujet suivant
#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
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
Pages: 1
- Sujet précédent - PG 14 : Trigger qui modifie les données en entrée "before insert" - Sujet suivant