PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 Re : PL/pgSQL » Impossible de supprimer une entité avec un trigger » 29/03/2018 16:00:21

Merci pour ce retour.
J'ai trouvé une astuce permettant de faire ce que je voulais.
Je passe par deux triggers:

Le premier permet de rajouter ou mettre à jour les lignes de coordination.numerisation dans dashboard.t_suivi.

CREATE OR REPLACE FUNCTION update_t_suivi() RETURNS TRIGGER AS $$
BEGIN
INSERT INTO dashboard.t_suivi  ( 
  id_coord, 
  lot, 
  cdd,
  mission_moe,
  id_prog, 
  id_nro, 
  numero,
  insee, 
  com_dep, 
  statut, 
  emprise, 
  nom, 
  travaux, 
  longueur, 
  debut_trvx, 
  prog_dsp, 
  moa, 
  commentair, 
  envoi_moe
)
VALUES(
 new.id_opp, 
  new.lot, 
  new.cdd,
  new.phase,
  new.id_prog, 
  new.id_nro,  
  new.numero,
  new.insee, 
  new.com_dep, 
  new.statut, 
  new.emprise, 
  new.nom, 
  new.travaux, 
  new.longueur, 
  new.debut_trvx, 
  new.prog_dsp, 
  new.moa, 
  new.commentair, 
  new.envoi_moe)
;
  RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';



DROP TRIGGER IF EXISTS trg_update_t_suivi_num ON dashboard.t_suivi;
DROP TRIGGER IF EXISTS trg_update_t_suivi_num ON coordination.numerisation;
CREATE TRIGGER trg_update_t_suivi_num
AFTER UPDATE OR INSERT ON coordination.numerisation
FOR EACH ROW
EXECUTE PROCEDURE update_t_suivi();

Le deuxième trigger permet de supprimer les lignes de dashboard.t_suivi ne figurant pas ou plus dans coordination.numerisation.

CREATE OR REPLACE FUNCTION delete_t_suivi() RETURNS TRIGGER AS $$
BEGIN
 WITH a_supprimer AS
(
SELECT *
FROM dashboard.t_suivi AS num
WHERE num.id_coord  NOT IN  
(SELECT DISTINCT id_opp
FROM coordination.numerisation  opp
WHERE id_coord=id_opp
GROUP BY id_coord, id_opp
))
DELETE FROM dashboard.t_suivi a
USING a_supprimer b
WHERE a.id = b.id;

  RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';



DROP TRIGGER IF EXISTS trg_delete_t_suivi_num ON dashboard.t_suivi;
DROP TRIGGER IF EXISTS trg_delete_t_suivi_num ON coordination.numerisation;
CREATE TRIGGER trg_delete_t_suivi_num
AFTER UPDATE OR DELETE ON coordination.numerisation 
FOR EACH ROW
EXECUTE PROCEDURE delete_t_suivi();

#2 Re : PL/pgSQL » Impossible de supprimer une entité avec un trigger » 29/03/2018 11:28:29

Merci gleu pour la réponse,

J'ai modifié le trigger avec un AFTER et j'arrive bien cette fois à supprimer l'entité rajoutée dans la table coordination.numerisation mais la ligne apparait toujours dans la table dashboard.t_suivi.
La c

DROP TRIGGER IF EXISTS trg_update_t_suivi ON dashboard.t_suivi;
DROP TRIGGER IF EXISTS trg_update_t_suivi ON coordination.numerisation;
CREATE TRIGGER trg_update_t_suivi
AFTER UPDATE ON coordination.numerisation 
FOR EACH ROW
WHEN (OLD.* IS DISTINCT FROM NEW.*)
EXECUTE PROCEDURE update_t_suivi();

et si je rajoute les conditions DELETE et INSERT

DROP TRIGGER IF EXISTS trg_update_t_suivi ON dashboard.t_suivi;
DROP TRIGGER IF EXISTS trg_update_t_suivi ON coordination.numerisation;
CREATE TRIGGER trg_update_t_suivi
AFTER INSERT OR DELETE OR UPDATE ON coordination.numerisation 
FOR EACH ROW
WHEN (OLD.* IS DISTINCT FROM NEW.*)
EXECUTE PROCEDURE update_t_suivi();

je reçois cette erreur:

ERROR:  ERREUR:  la condition WHEN du trigger INSERT ne peut pas référencer les valeurs OLD
LINE 6: WHEN (OLD.* IS DISTINCT FROM NEW.*)

#3 PL/pgSQL » Segmenter multilinestring en fonction d'une distance et création point » 29/03/2018 09:38:28

bruhnil
Réponses : 0

Bonjour à toutes et à tous,

J’ai une table spatiale d’adresses avec pour chaque entité adresse une géométrie de routes. Ainsi pour un type de voie + nom de voie (ex : avenue habib bourguiba) je vais avoir 20 adresses avec la même géométrie de route.
-    28 avenue habib bourguiba
-    29 avenue habib bourguiba
-    30 avenue habib bourguiba
-    21 avenue habib bourguiba
-    …
-    48 avenue habib bourguiba
Connaissant la longueur de chaque route (st_length) et le nombre d’adresses (intervalle) pour chacune d’entre elle, je peux obtenir st_length/intervalle (intervalle_m) soit la distance théorique entre chaque point adresse.
J’aimerais pouvoir segmenter mes lignes (routes)  en fonction de intervalle_m et créer un point (adresse) à chaque brisure de lignes. J’ai essayé sous postgis les fonctions St_Segmentize

(SELECT ST_DumpPoints( (ST_Segmentize((geom),intervale_m -- st_length/intervalle 
))) as geom
from ban.v_ban_travail_generate_series
group by  geom, intervale_m )

et St_interpolate_points

(select 	
id, 
ST_line_interpolate_point(st_makeline(st_linemerge(geom)),fraction --1/intervalle
) as geom from  ban.v_ban_travail_generate_series 
group by id, fraction)

mais les résultats ne sont pas bons.


Auriez vous une idée de comment procéder ?

Merci d’avance pour vos retours !

Marine.

#4 PL/pgSQL » Impossible de supprimer une entité avec un trigger » 28/03/2018 17:39:40

bruhnil
Réponses : 4

Bonjour,

Je dois mettre à jour une table dashboard.t_suivi à partir de la table coordination.numerisation.

CREATE OR REPLACE FUNCTION update_t_suivi() RETURNS TRIGGER AS $$
BEGIN
INSERT INTO dashboard.t_suivi  ( 
  id_coord, 
  lot, 
  cdd,
  mission_moe,
  id_prog, 
  id_nro, 
  numero,
  insee, 
  com_dep, 
  statut, 
  emprise, 
  nom, 
  travaux, 
  longueur, 
  debut_trvx, 
  prog_dsp, 
  moa, 
  commentair, 
  envoi_moe
)
VALUES(
 new.id_opp, 
  new.lot, 
  new.cdd,
  new.phase,
  new.id_prog, 
  new.id_nro,  
  new.numero,
  new.insee, 
  new.com_dep, 
  new.statut, 
  new.emprise, 
  new.nom, 
  new.travaux, 
  new.longueur, 
  new.debut_trvx, 
  new.prog_dsp, 
  new.moa, 
  new.commentair, 
  new.envoi_moe)
;
  RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';


DROP TRIGGER IF EXISTS trg_update_t_suivi ON coordination.numerisation;
CREATE TRIGGER trg_update_t_suivi
BEFORE INSERT OR DELETE OR UPDATE ON coordination.numerisation 
FOR EACH ROW
EXECUTE PROCEDURE update_t_suivi();

Lorsque je fais le test d'insérer une nouvelle entité dans la table coordination.numerisation, la ligne est bien automatiquement reportée dans la table dashboard.t_suivi, mais dès que je veux supprimer cette entité test dans la table numerisation, je reçois un message d’erreur : Impossible de valider les changements pour la couche Numérisation

Erreurs : ERREUR : 1 attribut non effacé.
 
Erreur du fournisseur de données :
      Erreur PostGIS lors de la suppression d'entité : ERREUR:  l'enregistrement « new » n'est pas encore affectée
    DETAIL:  La structure de ligne d'un enregistrement pas encore affecté est indéterminée.

Pourriez vous me dire ce qui cloche dans mon ma requete?

Merci d'avance!

Pied de page des forums

Propulsé par FluxBB