Vous n'êtes pas identifié(e).
Pages : 1
Juste pour info pour la rule :
CREATE rule mavue_upadate AS ON UPDATE TO une_vue DO INSTEAD SELECT updatemavue_trigger(OLD,NEW)
Évidemment, la déclaration de la fonction change :
CREATE OR REPLACE FUNCTION updatemavue_trigger(old_enreg une_vue, enreg une_vue) RETURNS void AS $$
Quels seront les types de old_enreg une_vue, enreg une_vue. et que représente une_vue?
Vous n'avez qu'une seule façon pour savoir ce qui a changé : comparer tous les champs de NEW avec tous les champs de OLD
Cest bien ce que je fais dans mais test if. J'ai pas tout présenté ici pas ne pas faire long.
...qu'il faudra passer en paramètre à votre fonction.
Eh bien j'aimerais bien savoir comment faire cela?
Par ailleurs, à partir du moment où un enregistrement est modifié, mettre à jour un ou 12 champs prendra approximativement le même temps. Donc si c'est juste pour 'ne mettre à jour que ce qui est nécessaire dans les colonnes', ne perdez pas votre temps à ça.
Si réellement c'est le même temps entre mettre à jour un champs et 12 alors le update est résolu.
Merci
Merci. Mais le problème se situe dans l'écriture de la régle et de la la fonction.
Si dans une application JEE par exemple j'ai un code du genre
Upate ma_vue set champ1='val1', champ2='val2', champ3='val3', ... champn='valn' where id=valeur
comment est ce qu'il faudrait écrire la régle pour faire passer le update que sur les champs qui ont réellement été modifiés? par exemple si seul les champ1, et 3 ont été modifié pouvoir faire
Upate ma_table set champ1='val1', champ3='val3', ... champn='valn' where id=valeur
Bonjour
J'ai une vue sur une table et je voudrais une régle pour la mise à jour de la table mais mon problème c'est la récupération des données et l'envoi vers la fonction appropriée.
Ci dessous une de mes tentative non fonctionnelles.
CREATE rule mavue_upadate AS ON UPDATE TO une_vue DO INSTEAD SELECT updatemavue_trigger(NEW)
CREATE OR REPLACE FUNCTION updatemavue_trigger(enreg record) RETURNS void AS $$
DECLARE
un_enreg enreg%ROWTYPE;
msql varchar :='';
i integer default 0;
BEGIN
SELECT * INTO un_enreg FROM matable WHERE id=enreg.id;
IF FOUND THEN
IF un_enreg.nom <> enreg.nom THEN
msql := 'nom = ' || enreg.nom;
i:=1;
END IF;
IF un_enreg.prenom <> enreg.prenom AND i<>0 THEN
msql := msql || ' AND prenom=' || enreg.prenom;
ELSE
msql := 'prenom=' || enreg.prenom;
i:=1;
END IF;
IF i<>0 THEN
EXECUTE 'UPDATE matable SET ' || msql;
END IF;
else
RAISE EXCEPTION 'Update impossible';
END IF;
END;
$$
LANGUAGE plpgsql;
Pages : 1