2015-05-08 73 views
0

我有兩個觸發器。 UPDATE和INSERT的一個觸發器和DELETE的一個觸發器。Oracle觸發器在幾次觸發後失敗

create or replace 
TRIGGER insup_trigger 
BEFORE INSERT OR UPDATE ON USER_GROUPS 
FOR EACH ROW 
BEGIN 
    UPDATE PROJECTS 
    SET TOUCHED = 1 
    WHERE ID IN (SELECT PJ_ID 
      FROM PROJECT_ROLES_GROUPS 
      WHERE GRP_ID = :NEW.GRP_ID); 
END; 

和刪除觸發器:

create or replace 
TRIGGER MARK 
BEFORE DELETE ON USER_GROUPS 
FOR EACH ROW 
BEGIN 
    UPDATE PROJECTS 
    SET TOUCHED = 1 
    WHERE ID IN (SELECT PJ_ID 
      FROM PROJECT_ROLES_GROUPS 
      WHERE GRP_ID = :OLD.GRP_ID); 
END; 

現在這些觸發器做工精細了幾次,但之後的錯誤拋出

ORA-01013: user requested cancel of current operation 
    ORA-06512: at "MARK", line 3 
    ORA-04088: error during execution of trigger 'MARK' 

做觸發從SQL Developer中的觸發器手動插入和刪除不會觸發錯誤,該錯誤會出現在插入和刪除的.net應用程序中。

我錯過了什麼嗎?

編輯:

閱讀中,我得到了暗示,這個問題可能在vb.net代碼中的註釋。我有:

adTrans = ADOCon.BeginTransaction() 
adCMD = New OdbcCommand(vsSQL, ADOCon) 
adCMD.Transaction = adTrans 

     Try 
      adCMD.ExecuteNonQuery() 
      adTrans.Commit() <- here is the error it should be 
      -> adCMD.Transaction.Commit() 
     Return True 
     Catch ex As Exception 
      ' Try to rollback the transaction 
      Try 
       adTrans.Rollback() 
       If vbSuppressOutput = False Then 
        MsgBox(ex.Message) 
       End If 

       System.Threading.Thread.Sleep(20) 
      Catch 
       ' Do nothing here; transaction is not active. 
      End Try 
      Return False 
     End Try 

所以我試着修改後的代碼,我不能再現問題了。 非常感謝您的評論!

+0

通常,ora-01013表示超時。這些長期的操作? – OldProgrammer

+0

@OldProgrammer只是一行插入2列,閃電般快,但事實上從vb.net的ExecuteNonQuery函數需要很多次,當它給出這個錯誤 – UrsulRosu

+3

任何機會,你有一個問題,其中多個會話試圖更新沒有提交的同一行,一個會話被阻塞,並且應用程序在一段時間後被設置爲超時?這與你所描述的內容看起來一致,但我們需要看看等待事件等,看看是否真的發生了什麼。 –

回答

0

問題的編輯是錯誤的。

由於意見建議問題是我沒有提交與SQL Developer完成的交易。

因爲用VB.net應用程序完成的事務無法完成並且生成了錯誤。