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

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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: 1159

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

jmarsac
Participant assidu
Lieu: NICE
Date d'inscription: 26 Oct 2005
Messages: 572
Site web

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

 

#6 Thu 05 July 2018 17:40

jmarsac
Participant assidu
Lieu: NICE
Date d'inscription: 26 Oct 2005
Messages: 572
Site web

Re: Mise à jour d'une table à partir d'une vue (trigger) [postgres]

Pouvez-vous poster la requête que vous exécutez ?


Jean-Marie
Azimut

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

jmarsac
Participant assidu
Lieu: NICE
Date d'inscription: 26 Oct 2005
Messages: 572
Site web

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

 

Pied de page des forums

Powered by FluxBB