HoudiniCH: Trigger Problem 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

  1. 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