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 : Optimisation » vue modifiable » 10/11/2010 18:57:41

Marc Cousin a écrit :

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?

#2 Re : Optimisation » vue modifiable » 10/11/2010 18:46:10

Marc Cousin a écrit :

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.

Marc Cousin a écrit :

...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

#3 Re : Optimisation » vue modifiable » 10/11/2010 18:24:50

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

#4 Re : Optimisation » vue modifiable » 10/11/2010 17:43:02

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;

Pied de page des forums

Propulsé par FluxBB