【问题标题】:Oracle Trigger fails after several times it is triggerdOracle Trigger 多次触发后失败
【发布时间】:2015-07-19 07:28:32
【问题描述】:

我有两个触发器。一个触发器用于 UPDATE 和 INSERT,一个触发器用于 DELETE。

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 应用程序中。

我错过了什么吗?

编辑:

阅读 cmets 我得到了问题可能出在 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

所以我尝试使用修改后的代码,但我无法再重现该问题。 非常非常非常感谢您在 cmets 上的位置!

【问题讨论】:

  • 通常,ora-01013 表示超时。这些是长时间的操作吗?
  • @OldProgrammer 只是插入一行有 2 列的行,快如闪电,但实际上来自 vb.net 的 ExecuteNonQuery 函数在给出此错误时需要很多时间
  • 您是否会遇到以下问题:多个会话尝试更新同一行而不提交,一个会话被阻塞,并且应用程序设置为在一段时间后超时?这似乎与您所描述的一致,但我们需要查看等待事件等,看看这是否真的发生了。
  • 它不是更大交易的一部分吗?看看将超时设置为更大的value。如果这样可以解决问题,那么您的 vb.net 客户端存在问题。
  • 您可以考虑只更新项目表中所触动的行不等于 1。

标签: oracle triggers


【解决方案1】:

问题的编辑有误。

正如 cmets 所说,问题在于我没有提交使用 SQL Developer 完成的事务。

因此,使用 VB.net 应用程序完成的事务无法完成并生成错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多