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
任何机会,你有一个问题,其中多个会话试图更新没有提交的同一行,一个会话被阻塞,并且应用程序在一段时间后被设置为超时?这与你所描述的内容看起来一致,但我们需要看看等待事件等,看看是否真的发生了什么。 –