From: | pgsql-bugs(at)postgresql(dot)org |
---|---|
To: | pgsql-bugs(at)postgresql(dot)org |
Subject: | delete in a trigger |
Date: | 2001-01-16 21:32:43 |
Message-ID: | 200101162132.f0GLWhx46714@hub.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-bugs |
Bruno LEVEQUE (bruno(dot)leveque(at)libertysurf(dot)fr) reports a bug with a severity of 3
The lower the number the more severe it is.
Short Description
delete in a trigger
Long Description
I have 2 tables and one trigger. When I delete a line in the first table, the trigger must delete a line in the second. The problem is :
The trigger wants to delete the line like I ask it but at the end it repeats the "delete" so it aborts the query. It sames to loop.
Is-it a Bug or an error ?
Sample Code
The trigger is :
CREATE FUNCTION "deletecheque" ( ) RETURNS opaque AS '
DECLARE
debitOld FLOAT8;
creditOld FLOAT8;
sommeOld FLOAT8;
intitule TEXT;
taux FLOAT8;
ordre FLOAT8;
debO1 FLOAT8;
debO2 FLOAT8;
credO1 FLOAT8;
credO2 FLOAT8;
BEGIN
RAISE DEBUG ''1 - '';
-- initialisation des variables
taux := extraitTaux(old.num_cpte,old.prixaction * old.nbaction);
ordre := extraitOrdre(old.num_cpte,old.prixaction * old.nbaction);
intitule := creeIntitule(old.code);
IF count(*) = 0 FROM enEuro
WHERE
num_cpte = old.num_cpte THEN
-- le compte est un compte en franc
sommeOld := creeSomme(old.prixaction,old.nbaction);
ELSE
-- le compte est un compte en euro
sommeOld := old.prixaction * old.nbaction;
END IF;
-- vrai si debit
-- faux si credit
IF old.deb_cred THEN
debitOld := sommeOld * (1 + taux) + ordre;
creditOld := 0;
ELSE
debitOld := 0;
creditOld := sommeOld * (1 - taux) - ordre;
END IF;
-- verification de l existence de la ligne dans la table CHEQUE
debO1 := debitOld - 0.01;
debO2 := debitOld + 0.01;
credO1 := creditOld - 0.01;
credO2 := creditOld + 0.01;
IF count(*) = 0 FROM cheque
WHERE
num_cpte = old.num_cpte
AND date = old.date
AND lib = intitule
AND deb >= debO1
AND deb < debO2
AND cred >= credO1
AND cred < credO2 THEN
RAISE EXCEPTION ''PAS de LIGNE REPONDANT AUX CRITERES'';
END IF;
-- suppression de la ligne de la table CHEQUE
DELETE FROM cheque
WHERE
num_cpte = old.num_cpte
AND date = old.date
AND lib = intitule
AND deb >= debO1
AND deb < debO2
AND cred >= credO1
AND cred < credO2;
RETURN old;
END;
' LANGUAGE 'plpgsql';
CREATE TRIGGER "deletebourse" AFTER DELETE ON "action" FOR EACH ROW EXECUTE PROCEDURE "deletecheque" ();
With the d2 flag I see :
query: delete from action where num_cpte=9 and date='13/12/2000'::date and code=
12546 and nbaction=50 and prixaction>=4.3 and prixaction<4.32 and deb_cred='t';
ProcessQuery
DEBUG: 1 -
query: SELECT extraitTaux( $1 , $2 * $3 )
query: SELECT frais.taux FROM frais WHERE num_cpte = $1 AND limitesup > $2
AND limiteinf < $3
query: SELECT $1
query: SELECT extraitOrdre( $1 , $2 * $3 )
query: SELECT frais.ordre FROM frais WHERE num_cpte = $1 AND limitesup > $2
AND limiteinf < $3
query: SELECT $1
query: SELECT creeIntitule( $1 )
query: SELECT action_nom.intitule FROM action_nom WHERE action_nom.code = $1
query: SELECT NOT $1
query: SELECT textcat('action : ', $1 )
DEBUG: intitule : "action : canal +"
query: SELECT $1
query: SELECT count(*) = 0 FROM enEuro WHERE num_cpte = $1
query: SELECT $1 * $2
query: SELECT $1
query: SELECT $1 * (1 + $2 ) + $3
query: SELECT 0
query: SELECT $1 - 0.01
query: SELECT $1 + 0.01
query: SELECT $1 - 0.01
query: SELECT $1 + 0.01
query: SELECT count(*) = 0 FROM cheque WHERE num_cpte = $1 AND date = $2 AN
D lib = $3 AND deb >= $4 AND deb < $5 AND cred >= $6 AND cred < $7
query: DELETE FROM cheque WHERE num_cpte = $1 AND date = $2 AND lib = $3 A
ND deb >= $4 AND deb < $5 AND cred >= $6 AND cred < $7
DEBUG: 1 -
DEBUG: intitule : "action : canal +"
ERROR: PAS de LIGNE REPONDANT AUX CRITERES
AbortCurrentTransaction
No file was uploaded with this report
From | Date | Subject | |
---|---|---|---|
Next Message | pgsql-bugs | 2001-01-17 10:50:57 | Bad rights working in referential integrity? |
Previous Message | phil | 2001-01-16 20:09:59 | Bug in date_part() |