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
所以我試着修改後的代碼,我不能再現問題了。 非常感謝您的評論!
通常,ora-01013表示超時。這些長期的操作? – OldProgrammer
@OldProgrammer只是一行插入2列,閃電般快,但事實上從vb.net的ExecuteNonQuery函數需要很多次,當它給出這個錯誤 – UrsulRosu
任何機會,你有一個問題,其中多個會話試圖更新沒有提交的同一行,一個會話被阻塞,並且應用程序在一段時間後被設置爲超時?這與你所描述的內容看起來一致,但我們需要看看等待事件等,看看是否真的發生了什麼。 –