Ciao a tutti, sto usando dei triggers per automatizzare alcune operazioni ma non funzionano come vorrei.

Dunque ho la tabella TB_DEBITI i cui campi rilevanti sono:
ID_OPERAZ (chiave primaria), DataSaldato (Date, default '9999-12-31'), ImportoTotale (Float(8,2)).
Questa tabella vuole rappresentare un "debito" da saldare, in cui ImportoTotale è la cifra e DataSaldato è quando il debito viene saldato (il valore di default si intende non ancora saldato).

Ho poi la dabella TB_DEBITI_DETT, i cui campi rilevanti sono:
ID_OP_DETT (chiave primareia), ID_OPERAZ (chiave esterna di join con la TB_DEBITI), ImportoParziale (Float(8,2)).
Questa tabella vuole rappresentare lo storico di come è stato saldato ogni debito di cui sopra, dove ImportoParziale rappresenta ogni "tranche" ti pagamento del debito a cui è collegato.
Il debito si considera saldato quando la somma di tutti gli ImportoParziale collegati è uguale a ImportoTotale

Quello che voglio fare con i trigger sulla TB_DEBITI_DETT è: ad ogni INSERT/UPDATE/DELETE, controlla a quanto ammonta la somma degli ImportoParziale relativi a un debito:
- se questa somma è maggiore di ImportoTotale, deve impedire l'INSERT/UPDATE
- se questa somma è uguale a ImportoTotale, deve aggiornare la TB_DEBITI valorizzando DataSaldato = now()
- se la somma è minore di ImportoTotale, se DataSaldato non è '9999-12-31' va valorizzato a tale valore.


In particolare, consideriamo ad esempio l'INSERT: le condizioni sopra si riassumono a:
- se la somma degli ImportoParziale già in tabella più quello nuovo appena inserito è maggiore di ImportoTotale, deve impedire l'INSERT
- se la somma degli ImportoParziale già in tabella più quello nuovo appena inserito è uguale a ImportoTotale, deve aggiornare la TB_DEBITI valorizzando DataSaldato = now()

Ho scritto questo:
codice:
CREATE
DEFINER=`edoedox_edo`@`%`
TRIGGER `edoedox_spesedb`.`TB_DEBITI_DETT_BINS`
BEFORE INSERT ON `edoedox_spesedb`.`TB_DEBITI_DETT`
FOR EACH ROW
BEGIN
	-- controllo importi
	SET @tot=(SELECT ImportoTotale FROM TB_DEBITI WHERE TB_DEBITI.ID_OPERAZ = NEW.ID_OPERAZ);
	SET @totpar=(SELECT sum(ImportoParziale) FROM TB_DEBITI_DETT WHERE TB_DEBITI_DETT.ID_OPERAZ = NEW.ID_OPERAZ);

	INSERT INTO tempt (c1, c2) VALUES (@tot, @totpar); -- DEBUG

	IF (@totpar + NEW.ImportoParziale > @tot) THEN
		set @msg = concat('Errore! Importo ',@totpar + NEW.ImportoParziale,'/',@tot);
		signal sqlstate '45000' set message_text = @msg;
	END IF;

	IF (@totpar + NEW.ImportoParziale = @tot) THEN
		UPDATE TB_DEBITI SET TB_DEBITI.DataSaldato = convert_tz(now(),'-08:00','+01:00') WHERE TB_DEBITI.ID_OPERAZ = NEW.ID_OPERAZ;
	END IF;

END$$
Alla riga --DEBUG, uso la tabella tempt come debug per vedere che fa, quasi sempre succede che: quando vado a fare gli insert, c1 (che sarebbe @tot) è sempre valorizzato correttamente, mentre invece c2 (che sarebbe @totpar) è NULL. Di conseguenza non funziona niente.

Cosa sbaglio?

Grazie mille!