Trigger Problem MySQL
HoudiniCH
- datenbank
- mysql
Hallo zusammen
Folgendes problem:
2 Tabellen:
auftrag
id|totalMannStunden|totalMaschinenStunden
buchung
id|effMannStunden|effMaschinenStunden|auftrag_id
z.B Auftrag: Holztisch
id|istMannStunden|istMaschinenStunden 1 | 0 | 0
Nun kommt eine Buchung hinzu, ausgelöst durch ein Formular einer Webapplikation
Buchung
id|effektivMannStunden |effektivMaschinenStunden|auftrag_id 1 | 2.5 | 2.5|1
Jetzt soll über einen Trigger die Tabelle Auftrag upgedatet werden... Bei dem 1. Datensatz geht es, wenn ich jedoch einen 2. Datensatz (Auftrag) hinzufüge und dort einen Rapport verbuche, passiert nix...
Trigger:
DROP TRIGGER IF EXISTS rts.tri_buchung_after_insert;
DELIMITER //
CREATE TRIGGER tri_buchung_after_insert
AFTER insert
ON buchung
FOR EACH ROW
BEGIN
UPDATE auftrag
SET auftrag.istMannstunden = (new.effektivMannStunden + auftrag.istMannstunden), auftrag.istMaschinenStunden = (new.effektivMaschinenStunden + auftrag.istMaschinenStunden)
WHERE new.auftrag_id = auftrag.id;
END//
DELIMITER ;
Auch so hab ich es versucht, jedoch löscht er alle istStunden bei den anderen Aufträgen und updatet nur den aktuellen:
DROP TRIGGER IF EXISTS rts.tri_buchung_after_insert;
DELIMITER //
CREATE TRIGGER tri_buchung_after_insert
AFTER update
ON buchung
FOR EACH ROW
BEGIN
UPDATE auftrag
SET auftrag.istMannStunden = (select sum(effektivMannStunden) from buchung where new.`auftrag_id` = auftrag.id), -- new.`effektivMannStunden` + auftrag.istMannstunden
auftrag.istMaschinenStunden = (select sum(effektivMaschinenStunden) from buchung where new.`auftrag_id` = auftrag.id);
END//
DELIMITER ;
Danke für eure Hilfe
Moin!
Deine Vorgehensweise ist schon einmal ungewöhnlich. Normalwerweise setzt man zwei (oder mehr) SQL- Befehle ab und verwendet Transaktionen. Also:
SET AUTOCOMMIT=0;
START TRANSACTION;
Befehl 1
Befehl 2
...
Befehl 3
## wenn alles gut ging:
COMMIT;
## sonst
ROLLBACK;
Das hat dann auch den Vorteil, dass Dein Programm nicht noch mehr zerstreut wird als unbedingt nötig. Ach so. Das machst Du natürlich innerhalb der gleichen Verbindung und wertest die MySQL-Fehlermeldungen in Deinem Programm aus umd dann das commit oder das rollback zu senden.
Danke für eure Hilfe
Bitte.
Jörg Reinholz