Триггер Oracle AFTER / BEFORE CREATE ON DATABASE: как получить доступ к источникам объектов - PullRequest
2 голосов
/ 08 августа 2011

Я пытаюсь реализовать псевдо-контроль версий и репозиторий для Oracle. Идея такова: когда хранимая функция / процедура изменяется или создается глобальная база данных срабатывает триггер, который будет захватывать текущие источники измененного объекта и сохранять их к столу. Поэтому я использую два триггера:

TRIGGER BEFORE_MODIFY before ALTER or CREATE ON DATABASE
TRIGGER AFTER_MODIFY after ALTER or CREATE ON DATABASE

Все работает нормально, за исключением того, что триггер AFTER_MODIFY видит старую версию (источники) скомпилированного объекта. Я попытался получить источники из SYS.SOURCE$.SOURCE и в качестве второй попытки из dbms_metadata.get_ddl(OBJ_TYPE, OBJ_NAME, OBJ_OWNER) с теми же результатами.

Я ищу совет или определенный ответ, такой как «Вы не можете сделать это в Oracle 10g +».

1 Ответ

0 голосов
/ 09 августа 2011

Предлагаем вам просто использовать ora_sql_txt, чтобы получить новый код:

create or replace TRIGGER AFTER_MODIFY after CREATE ON hr.SCHEMA 
declare
  sql_text ora_name_list_t;
  n number;
begin
  n := ora_sql_txt(sql_text);
  FOR i IN 1..n LOOP
   dbms_output.put_line(sql_text(i));
  END LOOP;
end;
/
...