2015-05-08 70 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应用程序完成的事务无法完成并且生成了错误。