Vous n'êtes pas identifié(e).
Pages : 1
donc avec un update apres le select ?
voila j'aimerai l'avis de personne expert sur Postgresql
le probleme peu etre bete
j'ai deja une solution toute trouver mais j'aimerai votre avis car ma solution et loin d'etre tres fine
voila je fait un select systematique sur une table lorsque un individu envoie une certaine requete sur le site
pour savoir si la donnee existe (si elle n'existe pas je la cree ) si elle existe j'aimerai incrementé un int
pour pouvoir par la suite faire une statistique gloable
la solution bateau et de faire un select
-un insert si le select revien vide
-et un update de l'increment si le select n'est pas vide
je ne parle pas ici d'un increment d'une clee primaire par l'insert
mais d'un increment d'une ligne
exemple les colone son ID champtext et NBconsultation
c'est le champs NBconsultation que j'aimerai autoincrementé à chaque select
seulement j'aimerai connaitre votre avis et je pense que cela doit etre possible avec une regle
et donc sans envoyer une 2eme requete de type update
oue enfin sa depend de quel point de vue on se place
enfaite mon idee de depart ete
faire un select de la date de mise a jour
si besoin de mise a jour on fait un select de frequencemot
le programme java calcule avec l'algorithme
on fait un controle pour savoir si l'ancien contenu et valide dans le programme java donc en claire si frequence mot a changer
on fait un update juste sur la fonction maj ou sur les colone maj et frequence mot suivant les cas
donc du coup cela devient
on fait un select de la date
si besoin de mise a jour
le programme java calcule avec l'algorithme
on fait donc systematiquement un update de la colone maj et frequencemot
la le trigger intervient
si frequencemot n'a pas changer ou si il a changer
en terme de performance le select et bcp plus couteux que l'update ? je ne connais pas beaucoup les bdd donc ... je me renseigne bon j'imagine que oui
bon donc mon super trigger devient
CREATE FUNCTION maj() RETURNS TRIGGER AS
$$
BEGIN
IF ( (TG_OP = 'INSERT') OR ((TG_OP = 'UPDATE') AND (OLD.frequencemot <> NEW.frequencemot)) ) THEN
NEW.idxsearch = to_tsvector(coalesce(NEW.frequencemot,''));
RETURN NEW;
END IF;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER montriggermajupd BEFORE INSERT OR UPDATE OF frequencemot ON information
FOR EACH ROW EXECUTE PROCEDURE maj();
donc cela nous donne 2 triggers et une fonction trigger
le premier trigger sur insert et le seconde sur update et plus particulierement sur les update de la colone frequencemot
CREATE FUNCTION maj() RETURNS TRIGGER AS
$$
BEGIN
NEW.idxsearch = to_tsvector(coalesce(NEW.frequencemot,''));
RETURN NEW;
END
$$ LANGUAGE plpgsql;
CREATE TRIGGER montriggermajUpd BEFORE UPDATE OF frequencemot ON information
FOR EACH ROW EXECUTE PROCEDURE maj();
CREATE TRIGGER montriggermajIns BEFORE INSERT ON information
FOR EACH ROW EXECUTE PROCEDURE maj();
j'ai tout bon ?
lol autant pour moi j'ai confondu row et column ... (boulet)
ok je te remercie pour le temps passer a m'aider
depuis la version 9.0 donc enfaite c'est pas tres vieux ok merci encore
merci pour le if sa peu etre interesant dans un autre cas
mais je ne penser pas forcement à ce cas la enfaite
je voudrais savoir si on ne peu pa jouer sur LA conlone quand on declare lactivation de la fonction genre
FOR EACH ROW EXECUTE PROCEDURE maj();
au lieu de EACH ROW je ne sais pas comment sa fonctionne mais ne pourai t'on pas metre juste la colone concernee exemple frequencemot
qui devient alor
FOR frequencemot EXECUTE PROCEDURE maj();
car par exemple je pourai avoir une variable de maj dans ma table qui contient la derniere date a laquel la maj a ete faite
je fait une requete select * dans mon programe par exemple et je refait le calcule de la source avec le meme algorythme que la premier insertion (sa parai logique)
si les valeur change alor je fai un update de tout se qui doi l'etre on passe alor dans le trigger d'update
si par contre rien n'a changer sauf la date de la maj qui devient la valeur apres le dernier scan effectuer dans le programe alor je fait un update seulement sur la maj
si je peu specifier la colone sur laquele le trigger agit je ne declenche meme pas celui ci
si je fai un update de ma variable maj
est ce possible ?
dans ce cas la j'utilise un trigger d'insert qui se declenche à l'insert quelque soi la colone donc EACH ROW et un autre d'update QUI se declenche seuelement si la colone Frequencemot subit l'update
du coup mon code de creation trigger et devenu
CREATE FUNCTION maj() RETURNS TRIGGER AS
$$
BEGIN
NEW.idxsearch = to_tsvector(coalesce(NEW.frequencemot,''));
RETURN NEW;
END
$$ LANGUAGE plpgsql;
CREATE TRIGGER montriggermaj BEFORE INSERT OR UPDATE ON information
FOR EACH ROW EXECUTE PROCEDURE maj();
j'ai bon ? la j'ai essayer sa à l'aire de fonctionner comme je veux du moin mon programe fai pas encore d'update maintenant ya peu etre moyen d'optimisé
par exemple la fin et
FOR EACH ROW EXECUTE PROCEDURE maj();
si j'ai bien compris pour chaque colone il effectue la requete meme si l'update ne met pas a jour frequence mots mai dans ce cas la je devrai faire 2 trigger
1 qui soccupe de l'insert
et un qui s'occupe de l'update de la colone frequence mots
est ce que ça vos le coup je veut dire gagnerais t'on meme quelque disieme de seconde sur des millier/million de requete ?
tant qu'a faire quelque chose ... autant le faire le mieux possible
donc enfaite le trigger s'intercale entre la requete et la bdd
se qui permet l'interception des donnees par la variable new
mais sa ouvre des perspective tout à fait nouvel ça
merci pour les réponses à mes questions
j'ai à peu pres tout compris seulement la vous me parler de geree l'update ce n'est pas faux mais pourais je utiliser le meme trigger (j'imagine que oui) parce que je vais tomber dans une boucle infini
l'update fait appele au trigger qui fait apele à update ... qui ...... trigger update trigger update
parce que si je fait un update qui change des mots par mon code dans mon programme ici java/tomcat il faut que je reface
UPDATE information
SET idxshearch = to_tsvector(coalesce(frequencemot,'')) WHERE clee=NEW.clee;
pour remetre à jour mon idxshearch
puisque que je vien de metre à jour frequencemot par exemple
or je tombe sur un bon gros cas de boucle infinie bien velue
j'ai vue dans le lien de la doc pour faire sa requete utilise une timekey
l'idee serai:
-je fait un update via mon logiciel pour modifier un ou plusieur champ
-le trigger et appeler il fait un update
-il verifie le temps si le temps et superieur à la limite du temp qui et fixer on fait un update
-le trigger se redeclenche forcement
-le temps vien d'etre mi a jour
-puisque le temp et inferieur a la limite
-il ne passe pas une nouvel fois dans l'update
ce serais une solution mais est ce "la" solution la plus efficance/simple
parce que avec cette solution je relance à nouveau le trigger pourais t'on dire pour rien et encore une fois j'ai l'impresion d'utiliser la bombe nucleaire pour chasser les mouche
sa fonctionne mais c'est pas tres fin
mais avant l'afflux de donnee puisque vous dite que cela vien d'ariver vous ne rencontriez pas des ralentisement ? qui permetrez de dire que la limitation et hardware ?
le ram disque n'est pas une heresie il faut simplement prendre quelque precaution comme utiliser un onduleur .. par exemple
pour dire de sauvegarder les donnee sans avoir de probleme
avec un ram disque meme si la perte de donne ne vous inquiete pas il yora quelque précaution à prendre pour evite les bdd corompu pendant une maj foireuse genre coupure d'electricite en plein millieu apres je ne connais pas le materiel d'on vous disposer
qu'entendez vous par gros volume de donnee ?
+ 1 pour la ram
mais alors la question que tout le monde se pose peu t'on dire à postgresql de chager la totalité de le base de donnee si elle n'est pas trop grosse biensur en memoire
(< a la ram quoi)
et de faire des sauvegarde reguliere sur le disque dur avant la femerture ou doit t'on passer par un ram disque et un script ?
ce qui reviendrai a
je demare le serveur
un script cree un ram disque et charge la bdd entiere dans la ram
//eventuelement des sauvegarde de la bdd sur le disque dure a interval regulier si pas d'ondulateur mais la c'est du suicide
je veux eteindre le serveur pour remplacer un ventilo par exemple
je doit avoir un script qui sauvegarde la bdd sur le disque dur avant de seteindre
sans compte sil ya une panne electrique avec un onduleur
pour sauvegarder proprement la bdd avant le drame
bonjour voila je debute avec les base de donnee surtout postgresql
j'ai utiliser un tutoriel
pour faire une recherche dite full texte (sans dico pour le moment mais ce n'est pas le probleme )
a un moment la personne du tuto tutoriel en question
execute une requete qui permet de remplire l'index d'ont il se sert pour la recherche full text
puis apre nous dit gentillement qu'il fodra cree un trigger ( efectivement sinon la table enfin du moin la colone de cette index text de se remplie pas pendant un insert )
donc j'ai cree un trigger avec une fonction trigger le probleme c'est que je pense que j'utilise une bombe atomique pour tuer une mouche avec ma fonction
enfaite ma fonction doit refaire tout les indice de la table a chaque insert j'imagine
voici la fonction et le triger
CREATE FUNCTION maj() RETURNS TRIGGER AS
$$
BEGIN
UPDATE information
SET idxshearch = to_tsvector(coalesce(frequencemot,''));
RETURN NULL;
END
$$ LANGUAGE plpgsql;
CREATE TRIGGER montriggermaj AFTER INSERT ON information
FOR EACH ROW EXECUTE PROCEDURE maj();
le probleme et qu'enfaite je ne vois pas comment acceder à l'insert qui et fait au temp T et ne pas metre a jour toute la table systematiquement
jai vue une variable NEW qui devai resoudre une parti du probleme code mais je ne sais pas comment je peu m'en servir
une autre question j'en profite pgadmin me dit que je n'est pas de clee primaire est ce normal pour une recherche full text ou pas merci de m'avoir lu
à oui je suis en 9.1 pour postgrsql
Pages : 1