Pages: 1
- Sujet précédent - [Postgis] Nouvelle clé étrangère lors d'une mise à jour d'une vue - Sujet suivant
#1 Thu 17 October 2019 13:15
- Brice73
- Participant occasionnel
- Date d'inscription: 28 Jun 2018
- Messages: 28
[Postgis] Nouvelle clé étrangère lors d'une mise à jour d'une vue
Bonjour
J'ai une table A liée à une table B via une clé étrangère.
J'ai une vue affichant les champs de mes tables A et B. Pour plusieurs raisons, j'utilise la fonction row_number() over() comme clé primaire de la vue.
Dans ma table A, j'ai une entité qui ne possède pas de valeur dans la table B (elle n'a pas de lien, donc pas de clé étrangère avec la table B)
Lors de la mise à jour de la vue, je voudrais ajouter une valeur dans un champ s'implémentant dans la table B. (Cela va donc crééer une nouvelle entité dans la table B).
Comment écrire sur ma fonction trigger que la nouvelle entité créée dans la table B va être lié à tel entité de la table A ? (Sachant que je n'ai pas fait d'autres modifications sur mon entité, donc je n'ai pas de NEW."idTableA")
Merci de votre aide
Hors ligne
#2 Thu 17 October 2019 17:22
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1218
Re: [Postgis] Nouvelle clé étrangère lors d'une mise à jour d'une vue
Salut,
quel est le champ que vous utilisez pour faire la jointure ?
Si vous pouviez poster les définitions de la vue et du trigger,
cela aiderait à aider.
Hors ligne
#3 Tue 22 October 2019 11:48
- Brice73
- Participant occasionnel
- Date d'inscription: 28 Jun 2018
- Messages: 28
Re: [Postgis] Nouvelle clé étrangère lors d'une mise à jour d'une vue
Bonjour
Merci de votre réponse. Voici donc la définition de ma vue et de mon trigger :
Code:
CREATE OR REPLACE VIEW public."001_Session_L"
AS
SELECT row_number() OVER ()::integer AS gid,
session.id AS "idSess",
polyligne.id AS "idPolyli",
commentaire_texte.id AS "idCmtTxt",
affaire.num_affaire AS "Num_aff",
session.nom_session AS "Nom_sess",
session.date_export::date AS "Date_exp",
polyligne.geometrie_qgis_2154,
polyligne.moins_bonne_precision AS "Preci_inf",
polyligne.precision_moyenne AS "Preci_moy",
polyligne.altitude_moyenne AS "Alt_moy",
polyligne.longueur AS "Longueur",
polyligne.date AS "Date_trace",
session.statut_validation AS "Stat_val",
commentaire_texte.texte AS "Comment",
session.photo AS "Photo",
session.commentaire_vocal AS "Comm_audio",
utilisateur.nom_utilisateur AS "Obs_nom"
FROM affaire
JOIN session ON affaire.num_affaire = session.affaire_ref_id
JOIN utilisateur ON session.observateur_ref_id = utilisateur.id
LEFT JOIN polyligne ON session.id = polyligne.session_ref_id
LEFT JOIN commentaire_texte ON session.commentaire_texte_ref_id = commentaire_texte.id
ORDER BY polyligne.id;
ALTER TABLE public."001_Session_L"
OWNER TO karumbureau_rct;
CREATE TRIGGER "001_Session_L_update"
INSTEAD OF UPDATE
ON public."001_Session_L"
FOR EACH ROW
EXECUTE PROCEDURE public."001_Session_L_update"();Code:
CREATE FUNCTION public."001_Session_L_update"()
RETURNS trigger
LANGUAGE 'plpgsql'
COST 100
VOLATILE NOT LEAKPROOF
AS $BODY$
DECLARE
p_new_primary_key INTEGER; -- pour stocker la nouvelle clé primaire de la table commentaire_texte
p_new_foreign_key INTEGER; -- pour stocker la nouvelle clé primaire de la table utilisateur
BEGIN
-- table session
UPDATE session SET
affaire_ref_id = NEW."Num_aff",
nom_session = NEW."Nom_sess",
statut_validation = NEW."Stat_val",
photo = NEW."Photo",
commentaire_vocal = NEW."Comm_audio"
WHERE id = NEW."idSess";
-- table utilisateur
IF OLD."Obs_nom" <> NEW."Obs_nom" THEN
SELECT id INTO p_new_foreign_key FROM utilisateur
WHERE nom_utilisateur = NEW."Obs_nom";
IF p_new_foreign_key IS NULL THEN
-- si aucun nom ne correspond, ne rien mettre à jour
RAISE EXCEPTION 'Nom incorrect : %', NEW."Obs_nom";
END IF;
UPDATE session SET observateur_ref_id = p_new_foreign_key
WHERE id = NEW."idSess";
END IF;
-- table commentaire
IF LENGTH(OLD."Comment") > 0 AND LENGTH(NEW."Comment") > 0 THEN
UPDATE commentaire_texte SET
texte = NEW."Comment"
WHERE id = OLD."idCmtTxt";
ELSIF LENGTH(OLD."Comment") > 0 THEN
UPDATE session SET
commentaire_texte_ref_id = NULL
WHERE id = NEW."idSess";
DELETE FROM commentaire_texte
WHERE id = OLD."idCmtTxt";
ELSE
INSERT INTO commentaire_texte (id, texte)
VALUES (nextval('commentaire_texte_id_seq'), NEW."Comment");
SELECT id INTO p_new_primary_key FROM commentaire_texte
WHERE texte = NEW."Comment";
UPDATE session SET commentaire_texte_ref_id = p_new_primary_key
WHERE id = NEW."idSess";
END IF;
-- table polyligne
IF OLD."idPolyli" <> NEW."idPolyli" THEN
UPDATE polyligne SET
geometrie_qgis_2154 = NEW."geometrie_qgis_2154",
geometrie_ewkt_4326 = st_AsEWKT(st_transform(NEW.geometrie_qgis_2154,4326)),
moins_bonne_precision = NEW."Preci_inf",
precision_moyenne = NEW."Preci_moy",
altitude_moyenne = NEW."Alt_moy",
longueur = st_length(NEW."geometrie_qgis_2154"),
date = NEW."Date_trace"
WHERE id = OLD."idPolyli";
END IF;
RETURN NEW;
END;
$BODY$;La table A et B dont je parlais sont les tables "session" et "commentaire"
La partie du trigger dont je n'arrive pas à trouver la bonne formule dans le "WHERE" est la suivante (ça ne peut pas fonctionner car il n'y a pas de "NEW.idSess" si dans la vue, on ne modifie que le commentaire et aucun autre champ) :
ELSE
INSERT INTO commentaire_texte (id, texte)
VALUES (nextval('commentaire_texte_id_seq'), NEW."Comment");
SELECT id INTO p_new_primary_key FROM commentaire_texte
WHERE texte = NEW."Comment";
UPDATE session SET commentaire_texte_ref_id = p_new_primary_key
WHERE id = NEW."idSess";
END IF;
Hors ligne
Pages: 1
- Sujet précédent - [Postgis] Nouvelle clé étrangère lors d'une mise à jour d'une vue - Sujet suivant


