Announcement

Collapse
No announcement yet.

Trigger startet verzögert

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Trigger startet verzögert

    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:
    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
    );
    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
    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;
    Vielen Dank schon mal für Eure Hilfe

    Andreas
    Zuletzt editiert von slanty; 24.02.2010, 14:31.

  • #2
    Im PHP Forum konnte man mir weiterhelfen. Wenn es interessiert, hier de Link:

    http://www.php.de/datenbanken/65059-...urch-view.html

    Comment

    Working...
    X