|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre éclairé
![]() Inscription : janvier 2004 Messages : 426 ![]() |
Bonjour,
J'essaye de créer mon premier trigger et je m'arrache un peu les cheveux.. J'ai essayé avec phpPgAdmin et directement en ligne de commande avec psql.. mais il ne veut rien savoir.. Bon, j'ai une table "dossiers" et une "ligne_facture" dans un schema "clients_dossiers" L'idee du trigger est tres simple.. a chaque insertion, (et dans l'ideal pour la suite, pour chaque update ou delete aussi...), je veux mettre a jour le champ "total" dans la table "dossiers" avec le montant declare dans "ligne_facture".. Le 1er argument est le montant unitaire, le 2eme, le nombre et le 3e, l'id dossier.. Donc : CREATE FUNCTION calcul_total (numeric, integer, integer) RETURNS OPAQUE AS ' BEGIN UPDATE dossiers SET total=total+($1*$2) WHERE id_dossier=$3; END; ' LANGUAGE plpgsl; la, il me sort "CREATE FUNCTION" donc ca a du marcher ? Apres je cree mon trigger : CREATE TRIGGER trg_calcul_total AFTER INSERT ON ligne_facture FOR EACH ROW EXECUTE PROCEDURE calcul_total(montant_unitaire,nb,id_dossier); Et la, j'ai deux fois la meme erreur d'affichée : ERROR : function calcul_total() does not exists Et en passant par phpPgAdmin.. pas mieux ! Alors comment faire ? Et autre question, pendant que j'y suis.. quand j'appelle la fonction depuis un trigger, je peux passer les parametres comme je l'ai fait ci dessus, en nommant les colonnes a utiliser ? Merci de m'aider.. je suis un peu paumé.. j'ai toujours bossé avec mysql.. et ca n'a rien a voir.. ou presque ! |
|
|
00
|
|
|
#2 | |||
|
Expert Confirmé Sénior
![]() ![]() Inscription : mai 2004 Messages : 4 490 ![]() |
Citation:
Les fonctions destinées à servir pour un trigger doivent répondre à plusieurs critères :
Dans ton cas, le code sera le suivant : Code :
__________________
FAQ XML ------------ « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser » Giacomo Leopardi |
|||
|
|
00
|
|
|
#3 |
|
Membre éclairé
![]() Inscription : janvier 2004 Messages : 426 ![]() |
AAaaaaahhhh fabuleux ! ca marche ! :-)
Merci !! j'avais lu la doc, mais les triggers en C.. ca a l'air bien compliqué ! Et la doc est pas super claire ! et y'a moyen de gerer les cas UPDATE et DELETE dans la meme fonction ou vaut mieux faire un trigger different pour chaque cas ? |
|
|
00
|
|
|
#4 | ||
|
Expert Confirmé Sénior
![]() ![]() Inscription : mai 2004 Messages : 4 490 ![]() |
Citation:
Citation:
__________________
FAQ XML ------------ « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser » Giacomo Leopardi |
||
|
|
00
|
|
|
#5 | |
|
Membre éclairé
![]() Inscription : janvier 2004 Messages : 426 ![]() |
Citation:
http://www.postgresql.org/docs/8.0/s...r-example.html heureusement, on trouve des docs sur plpgsql un peu partout.. Bon sinon j'ai traité les cas update et delete avec un trigger pour chaque.. et ca marche super bien.. apres avoir fait tout ca en php/mysql et en basculant sur php/postgres, on se sent tout d'un coup bien soulagé ... Merci pour ton aide ! |
|
|
|
00
|
|
|
#6 |
|
Candidat au titre de Membre du Club
![]() Inscription : avril 2004 Messages : 16 ![]() |
Bonjour,
je viens de réussir mon premier trigger. Very Happy Le but étant d'enregistrer les modif sur une table, en gardant l'ancienne valeur, la nouvelle, et la date et heure de la modif. voici la fonction: CREATE OR REPLACE FUNCTION proc_update_actions() RETURNS "trigger" AS $BODY$ DECLARE action_effectuee text; valeur_initiale text; valeur_modifiee text; BEGIN action_effectuee := TG_OP ; SELECT INTO valeur_initiale OLD.lbaction FROM actions ; SELECT INTO valeur_modifiee NEW.lbaction FROM actions ; INSERT INTO audit values (now(), action_effectuee, valeur_initiale, valeur_modifiee); RETURN NEW; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE; ALTER FUNCTION proc_update_actions() OWNER TO postgres; ça fonctionne très bien en update, mais pas en delete (à cause du NEW.lbaction qui est inconnu en cas de delete, je suppose). Comment étoffer cette fonction pour qu'elle gère l'update et le delete ? Merci |
|
|
00
|
|
|
#7 |
|
Candidat au titre de Membre du Club
![]() Inscription : avril 2004 Messages : 16 ![]() |
Bonjour,
je m'auto-répond : CREATE OR REPLACE FUNCTION proc_update_actions() RETURNS "trigger" AS $BODY$ DECLARE action_effectuee text; valeur_initiale text; valeur_modifiee text; BEGIN action_effectuee := TG_OP ; IF action_effectuee = 'DELETE' THEN SELECT INTO valeur_initiale OLD.lbaction FROM actions ; INSERT INTO audit values (now(), action_effectuee, valeur_initiale, NULL); RETURN OLD; ELSE SELECT INTO valeur_initiale OLD.lbaction FROM actions ; SELECT INTO valeur_modifiee NEW.lbaction FROM actions ; INSERT INTO audit values (now(), action_effectuee, valeur_initiale, valeur_modifiee); RETURN NEW; END IF; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE; ALTER FUNCTION proc_update_actions() OWNER TO postgres; |
|
|
00
|
|
|
#8 |
|
Candidat au titre de Membre du Club
![]() Inscription : avril 2004 Messages : 16 ![]() |
Concernant cette fonction, j'aimerais bien ajouter dans mon fichier audit, soit l'identifiant, soit le nom de l'utilisateur qui a effectué l'update ou le delete.
y a-t-il une variable pour identifier l'utilisateur ? Merci d'avance. |
|
|
00
|
|
|
#9 |
|
Invité régulier
![]() Inscription : février 2006 Messages : 9 ![]() |
Concernant ton utilisateur, tu as la variable current_user qui contient l'information que tu cherches.
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com