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

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

25.04.2024 10:54


22.06.2022 15:19
OlegON
 
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 nullthen
     
-- Чтобы не падала загрузка
     
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_textv_last_text) = 0 then
       
return;
     
end if;
    
exception when no_data_found then
      null
;
    
end;    -- Создание или удаление объекта
    insert into DB$SOURCE_CHANGE_LOG 
-- добавление записи в таблицу log
      
(idoperationownernametypetextipos_userMachinetime)
      
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
      
(idoperationownernametypetextipos_userMachinetime)
      
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, время: 10:54.

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