捕获表上的插入,更新和删除事件触发器并插入到另一个表中

时间:2016-07-17 07:46:19

标签: sql oracle performance plsql triggers

我有一个跟踪整个系统/解决方案的Activity表。 我在Activity表上创建了一个触发器。通过这个触发器,我捕获将被其他系统使用的系统的每个事件。此外,我将更改(I / U / D)插入到Event和EVENTCOLVAL表中。 EVENTCOLVAL表包含Activity表的所有列名和相应的值。

所以我的触发器看起来像这样:

 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;

P.S:我不想在触发器中对表EVENTCOLVAL使用多个插入,因为它会受到性能影响,因为我在Activity表中有30列,插入31行将是性能问题。此外,活动表的指标在1秒内至少有100个插入。因此,在一秒钟内插入至少3000行。由于触发器的同步特性,这将使得活动屏幕更慢并且实际上整个系统更慢。有没有其他方法可以

1 个答案:

答案 0 :(得分:1)

您可以创建嵌套集合+使用复合触发器(例如http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/triggers.htm#CIHEFGFD)+ forall插入。 的伪代码:

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;