Поиск PL / SQL источника удаления строки - PullRequest
2 голосов
/ 30 марта 2011

Я унаследовал некоторый неприятный код PL / SQL в базе данных 10g, который неправильно удаляет строки из конкретной таблицы.

Я знаю, что удаление происходит, потому что я настроил триггер, который записываетподробности строки при удалении строки.

Очевидно, что простым ответом будет «поиск» удаления из. «Однако только одна из задействованных процедур содержит 18 страниц PL / SQL, и процедура имеет около 25 параметров.. Удаление в коде указывает, какие строки удаляются с помощью очень сложных объединений, которые включают много параметров. Это неприятный, неприятный код, отладка которого займет некоторое время.

Существуют ли в Oracle инструменты, которые могут помочь мне точно определитьоператор, вызывающий удаление?

Что было бы идеально, так это триггер, который записывает трассировку стека при удалении, но я не думаю, что он существует.

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

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

Все мысли приветствуются.

Ответы [ 4 ]

2 голосов
/ 30 марта 2011

Возможно, вы захотите настроить аудит на этом столе, по крайней мере, пока вы пытаетесь точно выяснить, что происходит.10g имеет мелкозернистый аудит и аудит DML.Вот полезная ссылка .

Вот еще полный пример , в котором также показан подробный вывод.

Надеюсь, это поможет

2 голосов
/ 30 марта 2011

Похоже, вы работаете с большим процессом ETL? Я, вероятно, начал бы идти по этому поводу:

  • Копирование (очень) небольшого подмножества исходных данных в QA или среду разработки, включая несколько строк, которые, я знаю, будут удалены, а некоторые, которые, как я знаю, не удастся (возможно, данные за день - резервное копирование назад).

  • Запустите код, используя отладчик PL / SQL с точками останова в каждом операторе SQL «delete». Проверьте, не остались ли ваши строки после каждого «удаления». Это намного проще сделать с помощью IDE, такой как TOAD, но это можно сделать, используя только технологии Oracle. См. http://www.adp -gmbh.ch / ora / plsql / debug.html .

  • Существует также трассировка PL / SQL, как вы упомянули, которая может быть полезна для выявления подобных проблем в небольших фрагментах кода. Эти файлы становятся очень большими и очень быстрыми, поэтому может быть целесообразно выполнить трассировку с небольшим подмножеством данных, как и раньше.

  • Для трассировки стека исключений, посмотрите также здесь - http://paranoid -engineering.blogspot.com / 2008/07 / oracle-exception-processing-stack-trace.html Вы можете добавить дополнительный код для обработки исключений, а затем «заблокировать» таблицу, чтобы сгенерировать это «исключение» исключения

Возможно, вам придется прибегнуть к старому режиму ожидания - DBMS_OUTPUT после каждого оператора "DELETE" sql.

1 голос
/ 31 марта 2011

Добавьте спецификацию пакета в ваше приложение, которое хранит простую переменную состояния, например,

create or replace package app_state is
  g_state varchar2(30);
end;

Перед каждым удалением в коде PL / SQL установите для этого состояния нечто, позволяющее идентифицировать оператор удаления, например,

app_state.g_state := 'delete 1';
delete ... very ... complex ... stuff ...
app_state.g_state := 'delete 2';
delete ... more ... complex ... stuff ...

Вы можете прочитать и сохранить значение app_state.g_state в триггере, который у вас уже есть.

Это позволяет вам отслеживать / регистрировать, какой оператор удаления удаляет какую строку.

1 голос
/ 30 марта 2011

Функция DBMS_UTILITY.FORMAT_CALL_STACK создает трассировку стека текущего выполнения. Вы можете вызвать его из своего триггера и записать результат в отдельную таблицу (в автономной транзакции).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...