Announcement

Collapse
No announcement yet.

Was für Profis... - Trigger kommt nicht hinterher

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

  • Was für Profis... - Trigger kommt nicht hinterher

    Hallo,

    ich habe einen ganz einfach gestrickten Trigger auf einer ganz einfachen Tabelle.

    Code:
    create trigger tr_mytable_i 
    insert on mytable 
    referencing new as neu
    for each row
            (execute procedure ins_abgl_mytable(neu.feld1 ,neu.feld2 ,neu.feld3 ,'I' ));
    Hier die dazugehörige Prozedur ins_abgl_mytabelle
    Code:
    CREATE PROCEDURE ins_abgl_mytable(_feld1 INTEGER, _feld2 INTEGER, 
                                          _feld3 INTEGER, _knz CHAR(1)) 
    	INSERT INTO abgl_mytable VALUES(0, _feld1, _feld2, _feld3); 
    	EXECUTE PROCEDURE INS_LOG_TRIGGERS('tr_mytable', 
                                                            DBINFO('sqlca.sqlerrd1'), _knz); 
    END PROCEDURE;
    /* Hinweis: das erste Feld in  abgl_mytable ist ein SERIAL, daher der Value 0, damit das System den Increment automatisch hochzählen kann*/
    Der Vollständigkeit halber, hier die Prozedur INS_LOG_TRIGGERS
    Code:
    CREATE PROCEDURE INS_LOG_TRIGGERS(_tr_name CHAR(18), 
    				_tr_sequenz INTEGER, _knz CHAR(1)) 
    	INSERT INTO log_triggers VALUES(0, _tr_name, _tr_sequenz, 
    			_knz, CURRENT YEAR TO SECOND,0,0,0,0,0,0); 
    END PROCEDURE;
    Jetzt zum Problem. Vorweg: Die Trigger und stored Proc's scheinen komplett ok zu sein. Es hat NIE eine Fehlermeldung / Abbruch gegeben. Sie laufen im Produktivbetrieb seit Monaten, und der hier gezeigte Trigger hat IMMER gegriffen (bei mehreren Tausend triggerrelevanten Ereignissen pro Tag).

    Das Problem ist, dass der Trigger immer dann auszusetzen scheint, wenn man auf die Tabelle mytable ein Masseninsert macht (ein SCRIPT mit 1000 INSERT-Sätzen). Danach fehlen in den Abgleichtabellen oft fast alle Datensätze, sprich der Trigger hat schlicht nicht gegriffen oder nur sehr sporadisch! Es deutet einiges daraufhin, dass die zeitlichen Abstände zwischen den Triggerereignissen zu kurz sind, sprich die Datenbank kommt nicht hinterher. Man kann sich dann behelfen, indem man in besagtem Script irgendein SELECT-Statement hinter jeden INSERT schmuggelt. Die paar Millisekunden die der SELECT braucht, reichen scheinbar aus dass die Datenbank den Trigger zuende führen kann. Das klappt dann auch immer!

    Fassen wir also zusammen: Bei vereinzelten Triggerereignissen funktioniert es prima - bei einer großen Anzahl von Triggerereignissen schnell hintereinander, funktioniert es nicht!

    Vielleicht sollte ich erwähnen, dass die DB keine Transaktionen loggt (=Transaktionen sind ausgeschaltet).

    Kennt jemand das Problem? Ich kann mir nicht vorstellen dass das ein BUG ist. Gibt es vielleicht eine Art WAIT-Option, mit der man die DB anweisen kann, nach jeder Aktion (z.B. INSERT) die dranhängenden Trigger "fertigwerden" zu lassen, bevor das aktuelle Script weiterverarbeitet wird?


    Danke im Voraus!!!
Working...
X