Форум OlegON > Компьютеры и Программное обеспечение > Операционные системы и программное обеспечение > Oracle

Джоб на сохранение исходников при изменениях : Oracle

31.01.2025 15:01


22.06.2022 15:19
SQL код:
CREATE OR REPLACE TRIGGER TR_DB$SOURCE_CHANGE_LOG
  after create or alter or drop on DATABASE
declare
  v_sysevent  varchar2(25);
  v_text      clob; --
  v_last_text clob;
  n           number(5);
  sql_text    ora_name_list_t;
  ip          DB$SOURCE_CHANGE_LOG.IP%type;
  os_user     DB$SOURCE_CHANGE_LOG.Os_User%type;
  Machine     DB$SOURCE_CHANGE_LOG.Machine%type;
begin   
   ip      := coalesce(sys_context('userenv', 'ip_address'), 'unknown');
   os_user := coalesce(sys_context('userenv', 'os_user'), 'unknown');
   Machine := coalesce(sys_context('userenv', 'TERMINAL'), 'unknown');   -- Только пользовательские изменения
   if os_user = 'unknown' then
      return;
   end if;   if nvl(ora_dict_obj_owner, '#') not in ('USER')then
    return;
   end if;   if upper(ora_dict_obj_type) = 'JAVA' and
     (length(ora_dict_obj_name) > 30 or ora_dict_obj_name is null) then
     -- Чтобы не падала загрузка
     return;
   end if;  select ora_sysevent
    into v_sysevent
    from dual; -- название события  -- Текст команды
  n := ora_sql_txt(sql_text);
  FOR i IN 1 .. n LOOP
    v_text := v_text || sql_text(i);
  END LOOP;  if (v_sysevent = 'CREATE' OR v_sysevent = 'DROP') then
    begin
      select r.text
        into v_last_text
        from user.db$source_change_log r
       where r.name = ora_dict_obj_name
         and r.OWNER = ora_dict_obj_owner
         and r.type = ora_dict_obj_type
         and r.id = (select max(rr.id) 
                       from user.db$source_change_log rr
                      where rr.name = ora_dict_obj_name
                        and rr.OWNER = ora_dict_obj_owner
                        and rr.type = ora_dict_obj_type
                     );     
     -- Если последний текст по объекту такой же то не сохраняем                
     if dbms_lob.compare(v_text, v_last_text) = 0 then
       return;
     end if;
    exception when no_data_found then
      null;
    end;    -- Создание или удаление объекта
    insert into DB$SOURCE_CHANGE_LOG -- добавление записи в таблицу log
      (id, operation, owner, name, type, text, ip, os_user, Machine, time)
      select SEQ_DB$SOURCE_CHANGE_LOG.nextval,
             ora_sysevent, -- наименование события
             ora_dict_obj_owner, -- владелец объекта
             ora_dict_obj_name, -- название sобъекта
             ora_dict_obj_type, -- тип объекта
             v_text,
             ip,
             os_user,
             Machine,
             sysdate
        from dual;
  end if;
  
  -- Исключаем рекомпиляции инвалидов из девелопера
  if (v_sysevent = 'ALTER') and instr(v_text, 'COMPILE DEBUG') = 0 then
      -- Изменение объекта
      -- Создание или удаление объекта
    insert into DB$SOURCE_CHANGE_LOG -- добавление записи в таблицу log
      (id, operation, owner, name, type, text, ip, os_user, Machine, time)
      select SEQ_DB$SOURCE_CHANGE_LOG.nextval,
             ora_sysevent, -- наименование события
             ora_dict_obj_owner, -- владелец объекта
             ora_dict_obj_name, -- название sобъекта
             ora_dict_obj_type, -- тип объекта
             v_text,
             ip,
             os_user,
             Machine,
             sysdate
        from dual;
  end if;exception when 
  others then null;
end; 
Часовой пояс GMT +3, время: 15:01.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.