2015-05-08 2 views
0

У меня есть два триггера. Один триггер для UPDATE и INSERT и один триггер для DELETE.Oracle Trigger терпит неудачу после нескольких раз запускает

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, которые вставляют и удаляют.

Я что-то упустил?

EDIT:

Читая комментарии, я получил намек, что проблема может быть в коде 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 просто вставка строки с двумя столбцами, молниеносно, но функция ExecuteNonQuery от vb.net занимает много раз, когда она дает эту ошибку. – UrsulRosu

+3

. У любого случая, когда у вас есть проблема, когда несколько сеансов пытаются обновить одна и та же строка без фиксации, один сеанс блокируется, и приложение устанавливается на тайм-аут через некоторое время? Это похоже на то, что вы описываете, но нам нужно посмотреть события ожидания и т. Д., Чтобы увидеть, действительно ли это происходит. –

ответ

0

Редактирование вопроса неверно.

Как явствует из комментариев, проблема заключалась в том, что я не совершал транзакции с SQL Developer.

Из-за этого транзакции, выполненные с приложением VB.net, не были выполнены, и были сгенерированы ошибки.

Смежные вопросы