2016-07-17 8 views
0

Ich habe eine Aktivität Tabelle, die das gesamte System/Lösung verfolgt. Ich habe einen Trigger für die Aktivitätstabelle erstellt. Mit diesem Trigger erfasse ich jedes einzelne Ereignis des Systems, das von anderen Systemen verwendet wird. Weiter füge ich die Änderungen (I/U/D) in die Tabelle Event und EVENTCOLVAL ein. Die Tabelle EVENTCOLVAL enthält alle Spaltennamen und entsprechenden Werte für die Aktivitätstabelle.Capture einfügen, aktualisieren und löschen Ereignisse auf einer Tabelle Trigger und in eine andere Tabelle einfügen

So sieht meine Trigger wie folgt aus:

CREATE OR REPLACE TRIGGER TRIG_Actv 
    AFTER INSERT or UPDATE 
     ON Activity 
     FOR EACH ROW 
    DECLARE 
     lvEventId number; 
    BEGIN 
lvEventId := EventUniqId.NEXTVAL; 
    INSERT ALL 
      INTO Event (EventId,DateLastMaint) 
      VALUES (lvEventId, SYSTIMESTAMP) 
      INTO EVENTCOLVAL (EventId, COLNAME, COLVALUE) 
      VALUES (lvEventId, 'ActivityCol1', :new.ActivityCol1) 
      INTO EVENTCOLVAL (EventId, COLNAME, COLVALUE) 
      VALUES (lvEventId, 'ActivityCol2', :new.ActivityCol2) 
      INTO EVENTCOLVAL (EventId, COLNAME, COLVALUE) 
      VALUES (lvEventId, 'ActivityCol3', :new.ActivityCol3) 
      INTO EVENTCOLVAL (EventId, COLNAME, COLVALUE) 
      VALUES (lvEventId, 'ActivityCol4', :new.ActivityCol4) 
      INTO EVENTCOLVAL (EventId, COLNAME, COLVALUE) 
      VALUES (lvEventId, 'ActivityCol5', :new.ActivityCol5) 
      INTO EVENTCOLVAL (EventId, COLNAME, COLVALUE) 
      VALUES (lvEventId, 'ActivityCol6', :new.ActivityCol6) 
      INTO EVENTCOLVAL (EventId, COLNAME, COLVALUE) 
      VALUES (lvEventId, 'ActivityCol7', :new.ActivityCol7) 
      INTO EVENTCOLVAL (EventId, COLNAME, COLVALUE) 
      VALUES (lvEventId, 'ActivityCol8', :new.ActivityCol8) 
      --- 
      --- 
      --- 
      --- 
      --- 
      INTO EVENTCOLVAL (EventId, COLNAME, COLVALUE) 
      VALUES (lvEventId, 'ActivityCol30', :new.ActivityCol30) 
      SELECT * FROM dual; 
EXCEPTION 
    WHEN OTHERS THEN 
    ------- 
END TRIG_Actv; 

PS: Ich will nicht mehrere Einsätze für Tisch EVENTCOLVAL im Trigger verwenden, da es Performance-Hit sein wird, weil ich 30 Spalten in Activity Tisch und das Einfügen von 31 Zeilen ist ein Leistungsproblem. Außerdem sind die Metriken für die Aktivitätstabelle mindestens 100 Einsätze in 1 Sekunde. Also, atleast 3000 Zeilen in einer Sekunde einfügen. Dadurch wird der Aktivitätsbildschirm langsamer und das gesamte System langsamer, da der Trigger synchron ist. Gibt es eine andere Möglichkeit

Antwort

1

Sie können verschachtelte Sammlung erstellen + zusammengesetzte Trigger verwenden (Bsp. http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/triggers.htm#CIHEFGFD) + Forall einfügen. Pseudocode:

CREATE OR REPLACE TRIGGER compound_trigger ... 
........ 
l_nested t_nested := t_nested(); 
........ 
BEFORE EACH ROW IS 
    BEGIN 
    l_nested.extend(); 
    l_nested(l_nested.count) := ...//populate single row 
END BEFORE EACH ROW; 

AFTER STATEMENT IS 
BEGIN 
    FORALL i IN 1..l_nested.count 
    INSERT INTO EVENTCOLVAL(EventId, COLNAME, COLVALUE) VALUES (l_nested(i).eventId, l_nested(i).colName,l_nested(i).value); 
END AFTER STATEMENT; 
+0

Ich bin wirklich leid kommentieren so late.I verstehen Sie die Sammlung, ich verstehe auch, wenn Sie den Einsatz FORALL- für Einsatz gesagt, aber nicht verstanden, warum Sie verwenden Verbindung sagte auslöst. Warten auf Ihre Antwort und BTW vielen Dank für die Antwort :) –

+0

@AnkurBhutani In Verbindung Tiggers in vor Zeile stmt Sie alle STMT zur Sammlung hinzufügen. Dann nachher fügen Sie alle stmt auf einmal ein. Stellen Sie sich das vor: Sie UPDATE 3 Reihen in einem Heft. Dann triggern Sie einfach 3 separate einfügen und Verbindung erkennen, dass es ein STMT ist. Er feuert 3 Mal vor jeder Reihe, sammelt Daten und führt nach dem Stmt eine Einfügung von 3 Datensätzen durch. –

+0

Klingt interessant, ich werde es versuchen, danke. Akzeptieren Sie Ihre Antwort :) –