Message posté par : Léandre Béron
----------------------------------------
Bonjour,
Je souhaiterais à l'aide d'un trigger, lors d'une suppression d'un objet
linéaire, supprimer également tous les objets d'une table de correspondance où une clé
étrangère donne sur mon objet linéaire.
an_voie : des noms de voie.
an_section_voie : Table de correspondance entre mes linéaires et une ou plusieurs voie
associée.
(Un linéaire peut en effet avoir une ou plusieurs voie liée, une association N,N dans un
MCD)
geo_section_voie : Mes linéaires
A la suppression d'un linéaire de voie, je dois également supprimer tous les objets
dans la table an_section_voie qui ont une valeur de mon ID de geo_section_voie.
En faisant un AFTER DELETE, je n'arrive pas à récupérer mon ID de mon linéaire.
En faisant un BEFORE DELETE, je n'ai pas non plus réussi...
Voilà mon code ci-dessous.
Ne vous préoccuper pas de la première partie, qui recalcule la longueur de la voie suite à
une suppression d'objets dans la table de correspondance.
-----------------
Citation :
CREATE FUNCTION rva.delete_calcul_longueur_voie() RETURNS trigger AS $BODY$
DECLARE
v_long_delete real;
v_id_delete integer;
begin
IF (TG_TABLE_NAME = 'an_section_voie') THEN
SELECT longueur FROM rva.an_voie WHERE id_voie = OLD.id_voie INTO v_long_delete;
-- on recalcul la longueur avec le OLD.idvoie
v_id_delete := OLD.id_voie; -- on récupère ancien id_voie associé
v_long_delete := v_long_delete - (SELECT sum(st_length(s.geom)) FROM
rva.geo_section_voie s, rva.an_section_voie sv
WHERE sv.id_sectvoi = OLD.id_sectvoi AND s.id_section = sv.id_section);
IF v_long_delete IS null THEN -- si null on met 0 (nécessaire car le null emporte sur le
0 sur l'opération v_long_old au dessus)
v_long_delete := 0;
END IF;
UPDATE rva.an_voie SET longueur = v_long_delete WHERE id_voie = v_id_delete;
END IF;
-- marche pas ça...
IF (TG_TABLE_NAME = 'geo_section_voie') THEN
DELETE FROM rva.an_section_voie WHERE id_section = OLD.id_section;
END IF;
return NEW;
end;
$BODY$ LANGUAGE plpgsql;
-----------------
Et les triggers associés à cette fonction :
-----------------
Citation :
CREATE TRIGGER tr_calc_voies3 BEFORE DELETE ON rva.an_section_voie
FOR EACH ROW EXECUTE PROCEDURE rva.delete_calcul_longueur_voie();
-- lui ne marche pas..
CREATE TRIGGER tr_calc_voies4 BEFORE DELETE ON rva.geo_section_voie
FOR EACH ROW EXECUTE PROCEDURE rva.delete_calcul_longueur_voie();
-----------------
Visiblement un besoin simple, que je n'arrive pas à faire....
Egalement, si je supprime les objets dans cette table de correpondance, est-ce que ma
première partie de ma fonction trigger va se réaliser (sachant que pour chaque suppression
d'objets dans la table an_section_voie, je lance cette procédure) ?
En espérant avoir été compréhensible dans ma demande :)
Merci d'avance
Léandre
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=338629#p338629
Pour y répondre : geobd(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net