Création de mon premier trigger : Argh !
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 !
Re: Création de mon premier trigger : Argh !
Citation:
Envoyé par zevince
Merci de m'aider.. je suis un peu paumé.. j'ai toujours bossé avec mysql.. et ca n'a rien a voir.. ou presque !
Non, effectivement. :wink:
Les fonctions destinées à servir pour un trigger doivent répondre à plusieurs critères :
- Le type de la variable retournée doit être TRIGGER
- Elles ne prennent aucun arguments
- Dans le cas d'un trigger BEFORE, la fonction doit retourner dans la variable NEW l'enregistrement qui sera effectivement utilisé pour mouvementer la table (ou NULL dans le cas d'une annulation)
Dans le corps de la fonction, on peut accéder aux champs de la table à laquelle est relié le trigger, ainsi qu'à des variables de contexte par des variables spéciales : NEW, OLD, TG_WHEN...
Dans ton cas, le code sera le suivant :
Code:
1 2 3 4 5 6 7 8
| CREATE OR REPLACE FUNCTION calcul_total() RETURNS TRIGGER AS '
BEGIN
UPDATE dossiers SET total = total + NEW.montant_unitaire * NEW.nb WHERE id_dossier = NEW.id_dossier;
RETURN NEW;
END;
' LANGUAGE plpgsql;
CREATE TRIGGER tg_calcul_total AFTER INSERT ON ligne_facture FOR EACH ROW EXECUTE PROCEDURE calcul_total(); |