Hallo zusammen,
langsam verzweifle ich. In meiner Testdatenbank habe ich einen Trigger eingesetzt, der aufgrund von bestimmten gegebenheiten Daten in einer anderen Tabelle ändert. Das funktioniert hier auch wunderbar, nur wenn ich den selben Trigger in der Produktivumgebung anwende, dann verzögert die Datenbank (fast) immer die Ausführung um ca. 40sekunden!!!. Aber eben nicht immer.
Ich denke nicht, das es am Trigger selbst liegt, aber vielleicht habe ich da auch einen Denkfehler. Könnte sich mal jemand diesen Trigger ansehen? Könnte es auch ein Bug in der Datenbankversion sein, oder vielleicht einfach nur eine Server-Einstellung?
Ach ja hier zur Info:
Testdatenbank - mysql 5.1.30
Produktivsystem - mysql 5.0.77
UPDATE:
Inzwischen habe ich die Zeile gefunden die dieses Problem hervorruft:
Das wirklich verrückte ist, daß es einzeln aufgerufen sofort funktioniert, aber innerhalb dieses Triggers so lange dauert.
Es ist eine View die sich wiederum per JOIN auf eine andere View bezieht. Das sollte mysql aber eigentlich hinbekommen. Hat irgendjemand eine Idee?
Hier noch der komplette Trigger-code
Vielen Dank schon mal für Eure Hilfe
Andreas
langsam verzweifle ich. In meiner Testdatenbank habe ich einen Trigger eingesetzt, der aufgrund von bestimmten gegebenheiten Daten in einer anderen Tabelle ändert. Das funktioniert hier auch wunderbar, nur wenn ich den selben Trigger in der Produktivumgebung anwende, dann verzögert die Datenbank (fast) immer die Ausführung um ca. 40sekunden!!!. Aber eben nicht immer.
Ich denke nicht, das es am Trigger selbst liegt, aber vielleicht habe ich da auch einen Denkfehler. Könnte sich mal jemand diesen Trigger ansehen? Könnte es auch ein Bug in der Datenbankversion sein, oder vielleicht einfach nur eine Server-Einstellung?
Ach ja hier zur Info:
Testdatenbank - mysql 5.1.30
Produktivsystem - mysql 5.0.77
UPDATE:
Inzwischen habe ich die Zeile gefunden die dieses Problem hervorruft:
Code:
set @iststunden = ( SELECT round(v.arbeitszeit,3) FROM mitarbeiter_zeiterfassung_tag m LEFT JOIN view_zeiterfassung_tag_overview v on m.id_mitarbeiter_zeiterfassung_tag=v.fk_id_mitarbeiter_zeiterfassung_tag where m.id_mitarbeiter_zeiterfassung_tag=new.id_mitarbeiter_zeiterfassung_tag );
Es ist eine View die sich wiederum per JOIN auf eine andere View bezieht. Das sollte mysql aber eigentlich hinbekommen. Hat irgendjemand eine Idee?
Hier noch der komplette Trigger-code
Code:
DELIMITER // drop trigger if exists mitarbeiter_zeiterfassung_tag_aft_upd_tr// create trigger mitarbeiter_zeiterfassung_tag_aft_upd_tr after update on mitarbeiter_zeiterfassung_tag for each row BEGIN insert into _debug (feld1,feld2,feld3) values("update: beginn AZK",CURRENT_TIMESTAMP,new.id_mitarbeiter_zeiterfassung_tag); set @hasAZK = (select v.arbeitszeitkonto from mitarbeiter_vertraege mv INNER JOIN vertragsarten v on mv.fk_id_vertragsarten=v.id_vertragsarten where mv.fk_id_mitarbeiter=NEW.fk_id_mitarbeiter and (mv.von<=NEW.zeiterfassungsdatum and mv.bis >=NEW.zeiterfassungsdatum) limit 1); insert into _debug (feld1,feld2) values("after AZK / beginn tagewoche",CURRENT_TIMESTAMP); IF @hasAZK=1 THEN set @tagewoche = (select v.tagewoche from mitarbeiter_vertraege mv INNER JOIN vertragsarten v on mv.fk_id_vertragsarten=v.id_vertragsarten where mv.fk_id_mitarbeiter=NEW.fk_id_mitarbeiter and (mv.von<=NEW.zeiterfassungsdatum and mv.bis >=NEW.zeiterfassungsdatum) limit 1); insert into _debug (feld1,feld2) values("ende tagewoche / beginn stundenbasis",CURRENT_TIMESTAMP); set @stundenbasisprotag = (select v.stundenbasis_pro_tag from mitarbeiter_vertraege mv INNER JOIN vertragsarten v on mv.fk_id_vertragsarten=v.id_vertragsarten where mv.fk_id_mitarbeiter=NEW.fk_id_mitarbeiter and (mv.von<=NEW.zeiterfassungsdatum and mv.bis >=NEW.zeiterfassungsdatum) limit 1); insert into _debug (feld1,feld2) values("ende stundenbasis / beginn isfeiertag",CURRENT_TIMESTAMP); set @isfeiertag = (select f.feiertag from mitarbeiter_vertraege mv left join feiertage f on mv.fk_id_kalender=f.fk_id_kalender and f.feiertag=NEW.zeiterfassungsdatum where mv.fk_id_mitarbeiter=NEW.fk_id_mitarbeiter and (mv.von<=NEW.zeiterfassungsdatum and mv.bis >=NEW.zeiterfassungsdatum) limit 1); insert into _debug (feld1,feld2) values("ende isfeiertag / beginn sollstunden",CURRENT_TIMESTAMP); set @sollstunden = if ( (weekday(NEW.zeiterfassungsdatum)+1)<=@tagewoche and @isfeiertag is null and NEW.fk_id_zeiterfassungsstatus<>60 and NEW.fk_id_zeiterfassungsstatus<>80, @stundenbasisprotag, 0); insert into _debug (feld1,feld2) values("ende sollstunden / beginn isangelegt",CURRENT_TIMESTAMP); set @isAngelegt = (select m.id_mitarbeiter_zeitkonto from mitarbeiter_zeitkonto m where m.fk_id_mitarbeiter_zeiterfassung_tag=new.id_mitarbeiter_zeiterfassung_tag); insert into _debug (feld1,feld2) values("ende isangelegt / beginn insert or update",CURRENT_TIMESTAMP); IF @isAngelegt is null THEN insert into mitarbeiter_zeitkonto (fk_id_mitarbeiter_zeiterfassung_tag,iststunden,sollstunden) SELECT m.id_mitarbeiter_zeiterfassung_tag,v.arbeitszeit,@sollstunden FROM mitarbeiter_zeiterfassung_tag m LEFT JOIN view_zeiterfassung_tag_overview v on m.id_mitarbeiter_zeiterfassung_tag=v.fk_id_mitarbeiter_zeiterfassung_tag where m.id_mitarbeiter_zeiterfassung_tag=new.id_mitarbeiter_zeiterfassung_tag; ELSE set @iststunden = ( SELECT round(v.arbeitszeit,3) FROM mitarbeiter_zeiterfassung_tag m LEFT JOIN view_zeiterfassung_tag_overview v on m.id_mitarbeiter_zeiterfassung_tag=v.fk_id_mitarbeiter_zeiterfassung_tag where m.id_mitarbeiter_zeiterfassung_tag=new.id_mitarbeiter_zeiterfassung_tag ); update mitarbeiter_zeitkonto mz set mz.iststunden = (@iststunden), mz.sollstunden= (@sollstunden) where mz.fk_id_mitarbeiter_zeiterfassung_tag=new.id_mitarbeiter_zeiterfassung_tag; insert into _debug (feld1,feld2) values("ende insert or update",CURRENT_TIMESTAMP); END IF; END IF; END; // DELIMITER;
Andreas
Comment