2016-02-04 70 views
0

我們遇到以下觸發器的問題。我們想要在UPDATEPROCESSINFO表中插入一行,並在新的INSTANCEID中沒有行時更新它,以用於下一個。插入多行而不是一個的觸發器

但是我們驚訝地發現,有時候我們有多行同一個INSTANCEID。這是因爲它非常快嗎?如何防止這種情況發生?我們的目標是每INSTANCEID有一行。

感謝您的幫助

create or replace TRIGGER TRIG_UPDATE_PROCESS_INFO 
    AFTER INSERT ON PROCESSSTEP 
    FOR EACH ROW 
DECLARE 
    AUDIT_TIME TIMESTAMP(6); 
BEGIN 
    SELECT MAX(LASTUPDATETIME) 
    INTO AUDIT_TIME 
    FROM UPDATEPROCESSINFO 
    WHERE INSTANCEID = :NEW.INSTANCEID; 

    IF AUDIT_TIME IS NULL THEN 
    INSERT INTO UPDATEPROCESSINFO 
     (INSTANCEID, STEPID, STEPSTATUS, STEPITERATION, LASTUPDATETIME) 
    VALUES 
     (:NEW.INSTANCEID, :NEW.STEPID, :NEW.STATUS, :NEW.STEPITERATION, :NEW.AUDITTIMESTAMP); 
    ELSIF :NEW.AUDITTIMESTAMP > AUDIT_TIME THEN 
    UPDATE UPDATEPROCESSINFO 
     SET STEPID = :NEW.STEPID, 
      LASTUPDATETIME = :NEW.AUDITTIMESTAMP, 
      STEPSTATUS = :NEW.STATUS, 
      STEPITERATION = :NEW.STEPITERATION 
     WHERE INSTANCEID = :NEW.INSTANCEID; 
    END IF; 
END; 
+0

當插入'PROCESSSTEP'表時,如何生成'INSTANCEID'?序列沒有被使用? – Glenn

+0

INSTANCEID首先爲進程表(PROCESS)生成,然後用於進程步驟(PROCESSSTEP) – kkung

+0

':NEW.AUDITTIMESTAMP'的空值也會導致問題。 – Glenn

回答

1

這可能發生,因爲你必須被插入PROCESSSTEP爲同一INSTANCEID多個會話。如果其中兩個會話幾乎同時插入到PROCESSSTEP中,並且它們都沒有提交它們的更改,那麼這兩個會話都不會「看到」其他的更改,並且兩者都會認爲UPDATEPROCESSINFO中不存在一行。

在我看來,這種設計似乎有問題。我建議將其更改爲具有PROCESS_STEP_HISTORY表,並且隨着流程中的每個步驟完成,將一行插入到PROCESS_STEP_HISTORY中以記錄已完成的流程步驟的信息。然後,當事情需要了解的「最後」的步驟完成它只是像做

SELECT a.* 
    FROM (SELECT * 
      FROM PROCESS_STEP_HISTORY h 
      WHERE INSTANCE_ID = whatever 
      ORDER BY LASTUPDATETIME DESC) a 
    WHERE ROWNUM = 1 

它也有保留有關在這個過程中的每一步信息的優勢,這可能證明是有用的信息。

我也不建議使用觸發器來做這種事情。這是業務邏輯,將業務邏輯放入觸發器從來就不是一個好主意。

祝你好運。

相關問題