Pages: 1
- Sujet précédent - Mise à jour d'une table à partir d'une vue (trigger) [postgres] - Sujet suivant
#1 Tue 26 June 2018 16:20
- bruhnild
- Participant actif
- Lieu: Lyon
- Date d'inscription: 7 Jun 2014
- Messages: 130
Mise à jour d'une table à partir d'une vue (trigger) [postgres]
Bonjour,
J'ai une vue matérialisée ("vm_adresse") qui contient les informations de la table "bal". Cette vue est rafraîchie (REFRESH MATERIALIZED VIEW) avec un trigger lorsqu'une nouvelle entité de ma table de travail "bal" vient l'enrichir. Le choix de la vue matérialisée a été fait car il permet de gagner rapidité d'affichage dans qgis.
J'ai crée à partir de cette vue matérialisée une vue simple ("v_adresse") de manière à pouvoir l'employer dans la mise à jour de la table "t_adresse" (du modèle gracethd).
Voici la fonction :
Code:
CREATE OR REPLACE FUNCTION fn_update_rbal_t_adresse() RETURNS TRIGGER AS $$ BEGIN INSERT INTO rbal.t_adresse ( ad_code, ad_ban_id, ad_nomvoie, ad_fantoir, ad_numero, ad_rep, ad_insee, ad_postal, ad_alias, ad_nom_ld, ad_x_ban, ad_y_ban, ad_commune, ad_section, ad_idpar, ad_x_parc, ad_y_parc, ad_nat, ad_nblhab, ad_nblpro, ad_nbprhab, ad_nbprpro, ad_rivoli, ad_hexacle, ad_hexaclv, ad_distinf, ad_isole, ad_prio, ad_racc, ad_batcode, ad_nombat, ad_ietat, ad_itypeim, ad_imneuf, ad_idatimn, ad_prop, ad_gest, ad_idatsgn, ad_iaccgst, ad_idatcab, ad_idatcom, ad_typzone, ad_comment, ad_geolqlt, ad_geolmod, ad_geolsrc, ad_creadat, ad_majdate, ad_majsrc, ad_abddate, ad_abdsrc, nom_sro, nb_prises_totale, statut, cas_particuliers, nom_id, nom_pro, x, y, potentiel_ftte, geom ) VALUES( new.ad_code, new.ad_ban_id, new.ad_nomvoie, new.ad_fantoir, new.ad_numero, new.ad_rep, new.ad_insee, new.ad_postal, new.ad_alias, new.ad_nom_ld, new.ad_x_ban, new.ad_y_ban, new.ad_commune, new.ad_section, new.ad_idpar, new.ad_x_parc, new.ad_y_parc, new.ad_nat, new.ad_nblhab, new.ad_nblpro, new.ad_nbprhab, new.ad_nbprpro, new.ad_rivoli, new.ad_hexacle, new.ad_hexaclv, new.ad_distinf, new.ad_isole, new.ad_prio, new.ad_racc, new.ad_batcode, new.ad_nombat, new.ad_ietat, new.ad_itypeim, new.ad_imneuf, new.ad_idatimn, new.ad_prop, new.ad_gest, new.ad_idatsgn, new.ad_iaccgst, new.ad_idatcab, new.ad_idatcom, new.ad_typzone, new.ad_comment, new.ad_geolqlt, new.ad_geolmod, new.ad_geolsrc, new.ad_creadat, new.ad_majdate, new.ad_majsrc, new.ad_abddate, new.ad_abdsrc, new.nom_sro, new.nb_prises_totale, new.statut, new.cas_particuliers, new.nom_id, new.nom_pro, new.x, new.y, new.potentiel_ftte, new.geom) ; RETURN NEW; END; $$ LANGUAGE 'plpgsql';
Voici le trigger :
Code:
DROP TRIGGER IF EXISTS trg_update_rbal_t_adresse ON rbal.t_adresse; DROP TRIGGER IF EXISTS trg_update_rbal_t_adresse ON rbal.v_adresse; CREATE TRIGGER trg_update_rbal_t_adresse INSTEAD OF INSERT OR UPDATE ON rbal.v_adresse FOR EACH ROW EXECUTE PROCEDURE fn_update_rbal_t_adresse();
Lorsque je saisie une nouvelle entité dans ma table "bal", la vue matérialisée "vm_adresse" et la vue "v_adresse" s'actualisent bien mais pas la table "t_adresse".
Auriez vous une idée du pourquoi du comment? Merci d'avance pour vos retour!
Marine.
Hors ligne
#2 Wed 27 June 2018 14:34
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: Mise à jour d'une table à partir d'une vue (trigger) [postgres]
Salut,
le trigger est défini sur la vue v_adresse.
Pour le déclencher il faut exécuter des instructions INSERT ou UPDATE dessus.
Le rafraichissement de votre vue matérialisée ne déclenche, je crois,
aucun instruction de ce genre sur elle même, a fortiori encore moins sur v_adresse.
J'en profite pour vous faire remarquer qu'en cas d'UPDATE,
en admettant que votre trigger fonctionne, une nouvelle ligne sera ajoutée,
et non pas mise à jour, ce qui occasionnera nombre de doublons,
je ne sais pas si c'est le comportement que vous désirez.
Un peu de lecture :
https://docs.postgresql.fr/10/rules-views.html
https://docs.postgresql.fr/10/rules-mat … views.html
Hors ligne
#3 Wed 04 July 2018 16:15
- bruhnild
- Participant actif
- Lieu: Lyon
- Date d'inscription: 7 Jun 2014
- Messages: 130
Re: Mise à jour d'une table à partir d'une vue (trigger) [postgres]
Bonjour,
Merci pour votre réponse. Après plusieurs heures de tests, je ne suis pas plus avancée.
Ma table t_adresse ne s’actualise toujours pas lors de l'insertion de nouvelles entités dans la vue v_adresse avec ce trigger . La fonction est toujours la même.
Code:
DROP TRIGGER IF EXISTS trg_insert_rbal_t_adresse ON rbal.t_adresse; DROP TRIGGER IF EXISTS trg_insert_rbal_t_adresse ON rbal.v_adresse; CREATE TRIGGER trg_insert_rbal_t_adresse INSTEAD OF INSERT ON rbal.v_adresse FOR EACH ROW EXECUTE PROCEDURE fn_insert_rbal_t_adresse();
J'ai essayé les rules mais ça n'a rien donné avec ma vue.
Hors ligne
#4 Wed 04 July 2018 17:21
Re: Mise à jour d'une table à partir d'une vue (trigger) [postgres]
Bonsoir,
Vous faites bien un insert into rbal.v_adresse... ?
Comme vous l'a dit tumasgiu, un insert sur la table bal n'active pas le trigger
Dernière modification par jmarsac (Wed 04 July 2018 17:21)
Jean-Marie
Azimut
Hors ligne
#5 Thu 05 July 2018 16:19
- bruhnild
- Participant actif
- Lieu: Lyon
- Date d'inscription: 7 Jun 2014
- Messages: 130
Re: Mise à jour d'une table à partir d'une vue (trigger) [postgres]
Je suis désolée, j'ai décortiquée vos réponses pour essayer de voir où je me trompe mais je vois toujours pas...
Je réalise un insert dans t_adresse depuis v_adresse. Le trigger devrait se déclencher à chaque insertion d'une nouvelle entité (new) dans v_adresse.
Je remet la fonction et le trigger au cas où.
Code:
CREATE OR REPLACE FUNCTION fn_insert_rbal_t_adresse() RETURNS TRIGGER AS $$ BEGIN INSERT INTO rbal.t_adresse ( ad_code, ad_ban_id, ad_nomvoie, ad_fantoir, ad_numero, ad_rep, ad_insee, ad_postal, ad_alias, ad_nom_ld, ad_x_ban, ad_y_ban, ad_commune, ad_section, ad_idpar, ad_x_parc, ad_y_parc, ad_nat, ad_nblhab, ad_nblpro, ad_nbprhab, ad_nbprpro, ad_rivoli, ad_hexacle, ad_hexaclv, ad_distinf, ad_isole, ad_prio, ad_racc, ad_batcode, ad_nombat, ad_ietat, ad_itypeim, ad_imneuf, ad_idatimn, ad_prop, ad_gest, ad_idatsgn, ad_iaccgst, ad_idatcab, ad_idatcom, ad_typzone, ad_comment, ad_geolqlt, ad_geolmod, ad_geolsrc, ad_creadat, ad_majdate, ad_majsrc, ad_abddate, ad_abdsrc, nom_sro, nb_prises_totale, statut, cas_particuliers, nom_id, nom_pro, typologie_pro, x, y, potentiel_ftte, geom ) VALUES( new.ad_code, new.ad_ban_id, new.ad_nomvoie, new.ad_fantoir, new.ad_numero, new.ad_rep, new.ad_insee, new.ad_postal, new.ad_alias, new.ad_nom_ld, new.ad_x_ban, new.ad_y_ban, new.ad_commune, new.ad_section, new.ad_idpar, new.ad_x_parc, new.ad_y_parc, new.ad_nat, new.ad_nblhab, new.ad_nblpro, new.ad_nbprhab, new.ad_nbprpro, new.ad_rivoli, new.ad_hexacle, new.ad_hexaclv, new.ad_distinf, new.ad_isole, new.ad_prio, new.ad_racc, new.ad_batcode, new.ad_nombat, new.ad_ietat, new.ad_itypeim, new.ad_imneuf, new.ad_idatimn, new.ad_prop, new.ad_gest, new.ad_idatsgn, new.ad_iaccgst, new.ad_idatcab, new.ad_idatcom, new.ad_typzone, new.ad_comment, new.ad_geolqlt, new.ad_geolmod, new.ad_geolsrc, new.ad_creadat, new.ad_majdate, new.ad_majsrc, new.ad_abddate, new.ad_abdsrc, new.nom_sro, new.nb_prises_totale, new.statut, new.cas_particuliers, new.nom_id, new.nom_pro, new.typologie_pro, new.x, new.y, new.potentiel_ftte, new.geom) ; RETURN NEW; END; $$ LANGUAGE 'plpgsql';
Code:
DROP TRIGGER IF EXISTS trg_insert_rbal_t_adresse ON rbal.t_adresse; DROP TRIGGER IF EXISTS trg_insert_rbal_t_adresse ON rbal.v_adresse; CREATE TRIGGER trg_insert_rbal_t_adresse INSTEAD OF INSERT ON rbal.v_adresse FOR EACH ROW EXECUTE PROCEDURE fn_insert_rbal_t_adresse();
Merci pour votre patience!
Hors ligne
#7 Mon 16 July 2018 08:15
- bruhnild
- Participant actif
- Lieu: Lyon
- Date d'inscription: 7 Jun 2014
- Messages: 130
Re: Mise à jour d'une table à partir d'une vue (trigger) [postgres]
Bonjour,
La requête que j'exécute est composée de la fonction postée dans mon précédent message
Message de pg admin :
CREATE FUNCTION Query returned successfully in 161 msec.
Suivi du trigger.
Message de pg admin :
NOTICE: le trigger « trg_insert_rbal_t_adresse » de la relation « rbal.t_adresse » n'existe pas, poursuite du traitement NOTICE: le trigger « trg_insert_rbal_t_adresse » de la relation « rbal.v_adresse » n'existe pas, poursuite du traitement CREATE TRIGGER Query returned successfully in 214 msec.
Hors ligne
#8 Mon 16 July 2018 10:00
Re: Mise à jour d'une table à partir d'une vue (trigger) [postgres]
Quelle est la requête d'insertion de données que vous exécutez. Pour l'instant, vous avez créé une fonction, des triggers mais inséré aucune donnée
Jean-Marie
Azimut
Hors ligne
Pages: 1
- Sujet précédent - Mise à jour d'une table à partir d'une vue (trigger) [postgres] - Sujet suivant