Ошибка триггеров Oracle не фиксируется при использовании ADODB - PullRequest
1 голос
/ 12 мая 2009

У меня есть и приложение, которое использует Adodb для вставки данных в таблицу Oracle (база данных клиентов).

  1. Данные успешно вставлены, если ошибок нет.
  2. Если есть какая-либо ошибка, например, неверный тип данных и т. Д. Ошибка возникает и регистрируется моим приложением и выводится в файл журнала.
  3. Мой клиент написал свои собственные триггеры на этой конкретной таблице. Когда запись вставлена, несколько других проверок выполняются перед вставкой данных

Теперь все хорошо до сих пор.

Но недавно мы обнаружили, что много раз данные не вставляются в таблицу оракулов.

  1. При проверке в файле журнала ошибка не обнаружена.
  2. Затем я зарегистрировал запрос, который был выполнен.
  3. Скопировал запрос в приглашение oracle Sql и выполнил его, выдав ошибку триггера.

Моя проблема

  1. Клиент не готов предоставить информацию о триггере.
  2. Ошибка не возникает при вставке в таблицу оракулов, поэтому мы не можем войти в нее или предпринять какие-либо действия.
  3. Тот же самый qry при выполнении непосредственно в oracle отображаются ошибки триггера.

Требуется помощь для

  1. Почему ошибка не возникает в ADODB
  2. Должен ли я сообщать клиенту о возникновении ошибки
  3. Все, что вы можете предложить для решения проблемы

У меня от 0% до 10% знания Oracle

Ответы [ 3 ]

1 голос
/ 13 мая 2009

"Скопировал запрос в приглашение oracle Sql и выполнил его, выдав ошибку триггера." Поскольку сеанс ADO не сообщает об ошибке, возможно, ошибка триггера вводит в заблуждение. Это может быть просто проверка строк «Эй, вам не разрешено вставлять в эту таблицу, кроме приложения».

«Ошибка не возникает при вставке в таблицу оракулов, поэтому мы не можем ее зарегистрировать или предпринять какие-либо действия». Если ошибка не возникла во время вставки, она МОЖЕТ быть вызвана во время фиксации. Отсроченные ограничения и материализованные представления могут дать это.

Гипотетически, я мог бы воспроизвести ваш опыт следующим образом: 1. Создайте таблицу tab_a с отложенным ограничением, изначально отложенным (например, val_a> 10) 2. Сеанс ADO вставляет строку, нарушающую ограничение, но не вызывает ошибки, поскольку ограничение отложено 3. Выполняется фиксация, возникает исключение нарушения ограничения, и транзакция откатывается вместо фиксации.

Посмотрите, не хотите ли вы допустить ошибку в коммите.

Это может быть что-то еще позже в транзакции, что приводит к откату всей транзакции (например, тупик). Трассировка сессии была бы хорошей. В противном случае посмотрите на триггер SERVERERROR на пользователе, чтобы зарегистрировать ошибку (например, в файле, чтобы она не откатывалась)

http://download -west.oracle.com / Docs / кд / B19306_01 / server.102 / b14200 / statements_7004.htm # i2153530

1 голос
/ 11 июля 2012
  1. Вы можете записать свою бизнес-логику в таблицу журналов.
  2. Но вы должны использовать хранимую процедуру для записи сообщения.
  3. Хранимая процедура должна иметь прагму Transaction, так что ваши данные журнала должны быть сохранены в таблице журнала.
  4. Вы триггер должен иметь обработку ошибок - и при обработке ошибок, вы должны вызвать зарегистрированную хранимую процедуру (которая имеет прагматическую транзакцию)
0 голосов
/ 12 мая 2009

Я никогда не использовал adodb (и я предполагаю, что это то, что вы используете, а не ADO.NET?) .. Но быстрый взгляд на его ссылки приводит к этому вопросу. Вы действительно проверяете состояние возврата Ваш запрос?

$ok = $DB->Execute("update atable set aval = 0");
if (!$ok) mylogerr($DB->ErrorMsg());
...