Рефакторинг триггеров PL / SQL - извлечение процедур - PullRequest
3 голосов
/ 27 апреля 2010

у нас есть приложение, в котором база данных содержит большую часть бизнес-логики в триггерах, с обновлением, которое впоследствии запускает триггеры для нескольких других таблиц. Я хочу реорганизовать беспорядок и хотел начать с извлечения процедур из триггеров, но не могу найти надежного инструмента для этого. Использование «Извлечь процедуру» в SQL Developer и Toad не смогло правильно обработать триггерные переменные: new и: old.

Если у вас была похожая проблема с триггерами, вы нашли способ ее обойти?

РЕДАКТИРОВАТЬ: В идеале, только столбцы, на которые ссылается извлеченный код, будут отправлены как параметры ввода / вывода, например:

Пример исходного кода, извлекаемого из триггера:

  .....
  if :new.col1 = some_var then
    :new.col1 := :old.col1
  end if
  .....

станет:

  procedure proc(in old_col1 varchar2, in out new_col1 varchar2, some_var varchar2) is
  begin
    if new_col1 = some_var then
      new_col1 := old_col1
    end if;
  end;
  ......
  proc(:old.col1,:new.col1, some_var);

Ответы [ 2 ]

1 голос
/ 16 мая 2010

Звучит так, будто вы хотите выполнить преобразования в PL / SQL-источнике. Чтобы сделать это надежно, вам нужен инструмент, который может анализировать PL / SQL с некоторой структурой данных компилятора, сопоставлять шаблоны с этой структурой и вносить направленные изменения, а затем повторно генерировать измененный код PL / SQL.

Набор инструментов для реинжиниринга программного обеспечения *1003* является таким инструментом. Параметрируется переводимым языком программирования; он имеет готовые интерфейсы для многих языков, включая C, C ++, C #, Java, COBOL и ... PL / SQL.

0 голосов
/ 29 апреля 2010

Это не совсем ответ. Очевидно, у меня недостаточно репутации, чтобы редактировать оригинальный вопрос. Проблема в том, что это не «рефакторинг», как мы обычно думаем. Даже когда вы создадите кучу процедур из триггеров, вам потребуется создать подходящую среду для их запуска, чтобы достичь оригинальной функциональности. Я подозреваю, что это тоже вызов.

В качестве предложения по решению я бы выбрал один сценарий python на основе конечного автомата (см. Например http://www.ibm.com/developerworks/library/l-python-state.html) Если вы поставите строгое определение того, что и как следует переводить, это будет легко осуществить.

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