У меня есть два триггера. Один триггер для 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
Поэтому я попытался с измененным кодом, и я больше не могу воспроизвести проблему. Большое спасибо за ваше место на комментариях!
обычно, ora-01013 является индикатором таймаута. Являются ли эти длительные операции? – OldProgrammer
@OldProgrammer просто вставка строки с двумя столбцами, молниеносно, но функция ExecuteNonQuery от vb.net занимает много раз, когда она дает эту ошибку. – UrsulRosu
. У любого случая, когда у вас есть проблема, когда несколько сеансов пытаются обновить одна и та же строка без фиксации, один сеанс блокируется, и приложение устанавливается на тайм-аут через некоторое время? Это похоже на то, что вы описываете, но нам нужно посмотреть события ожидания и т. Д., Чтобы увидеть, действительно ли это происходит. –