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;