Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Использования ХП в триггерах  [new]
Жираф Подвальный
Member

Откуда: Киев
Сообщений: 83
Доброго дня всем!
Триггер является анонимным блоком, т.е. не имеющим имени. Один из знакомых программистов достойный доверия обранил фразу, что аудит таблиц надо строить если не на стандартных ораколовских возможностях, то хотя бы на хранимых процедурах.
К сожалению не успел расспросить как именно. Искал в гугле да и тут - безуспешно.
Решил попробовать сам

Вот так выглядила процедура аудита ДО
create or replace trigger TR#A_ORDER_GRAPH_WARES before insert or update or delete on ERP.ORDER_GRAPH_WARES for each row 
begin
 if sys_context('context',pkg_c.contxt_DISABLE_AUDIT) = 1 then 
   return ; 
 end if ;



 if INSERTING then
   :new.DATE_OPERATION_AUD     := sysdate ; 
   :new.ID_USER_LOG_CHANGE := nvl(sys_context('context',erp.pkg_c.contxt_CHANGE_USER),erp.pkg_sys.Get_UserID) ;
   :new.JOB_NAME           := pkg_c.vses_JOB_NAME ; 
   :new.OSUSER             := pkg_c.vses_osuser   ; 
   :new.TERMINAL           := pkg_c.vses_terminal ; 
   :new.PROGRAM            := pkg_c.vses_program  ; 

   return ; 
 end if ;

 if UPDATING then 
   if not (
      erp.pkg_sys.DifValue(:new.IS_SEASON,:old.IS_SEASON) or
      erp.pkg_sys.DifValue(:new.QTY_SALE_B7,:old.QTY_SALE_B7) or
      erp.pkg_sys.DifValue(:new.QTY_SALE_B3,:old.QTY_SALE_B3) or
      erp.pkg_sys.DifValue(:new.QTY_SALE_B30,:old.QTY_SALE_B30) or
      erp.pkg_sys.DifValue(:new.ID_CONTRACT,:old.ID_CONTRACT) or
      erp.pkg_sys.DifValue(:new.ID_UNIT,:old.ID_UNIT) or
      erp.pkg_sys.DifValue(:new.ID_ORDER_GRAPH_WARES,:old.ID_ORDER_GRAPH_WARES) or
      erp.pkg_sys.DifValue(:new.ID_ORDER_GRAPH,:old.ID_ORDER_GRAPH) or
      erp.pkg_sys.DifValue(:new.ID_WARES,:old.ID_WARES) or
      erp.pkg_sys.DifValue(:new.IS_DEL,:old.IS_DEL) or
      erp.pkg_sys.DifValue(:new.COEFF,:old.COEFF) )
   then 
     return ; 
   else 
     :new.DATE_OPERATION_AUD     := sysdate ; 
     :new.ID_USER_LOG_CHANGE := nvl(sys_context('context',erp.pkg_c.contxt_CHANGE_USER),erp.pkg_sys.Get_UserID) ;
     :new.JOB_NAME           := pkg_c.vses_JOB_NAME ; 
     :new.OSUSER             := pkg_c.vses_osuser   ; 
     :new.TERMINAL           := pkg_c.vses_terminal ; 
     :new.PROGRAM            := pkg_c.vses_program  ; 

   end if ;
 end if ;

 insert into AUD_ERP.A_ORDER_GRAPH_WARES(
     ID_AUDIT ,
     TYPE_OPERATION ,
     DATE_OPERATION_AUD ,
     ID_USER_LOG_CHANGE ,
     JOB_NAME ,
     OSUSER ,
     TERMINAL ,
     PROGRAM ,
     IS_SEASON,
     QTY_SALE_B7,
     QTY_SALE_B3,
     QTY_SALE_B30,
     ID_CONTRACT,
     ID_UNIT,
     ID_ORDER_GRAPH_WARES,
     ID_ORDER_GRAPH,
     ID_WARES,
     IS_DEL,
     COEFF) 
 values (
     AUD_ERP.SEQ_A_ORDER_GRAPH_WARES.nextval,
     'U',
     nvl(:old.DATE_OPERATION_AUD,sysdate),
     :old.ID_USER_LOG_CHANGE,
     :old.JOB_NAME,
     :old.OSUSER,
     :old.TERMINAL,
     :old.PROGRAM,
     :old.IS_SEASON,
     :old.QTY_SALE_B7,
     :old.QTY_SALE_B3,
     :old.QTY_SALE_B30,
     :old.ID_CONTRACT,
     :old.ID_UNIT,
     :old.ID_ORDER_GRAPH_WARES,
     :old.ID_ORDER_GRAPH,
     :old.ID_WARES,
     :old.IS_DEL,
     :old.COEFF) ;

 if DELETING then
   insert into AUD_ERP.A_ORDER_GRAPH_WARES(
     ID_AUDIT ,
     TYPE_OPERATION ,
     DATE_OPERATION_AUD ,
     ID_USER_LOG_CHANGE ,
     JOB_NAME ,
     OSUSER ,
     TERMINAL ,
     PROGRAM ,
     IS_SEASON,
     QTY_SALE_B7,
     QTY_SALE_B3,
     QTY_SALE_B30,
     ID_CONTRACT,
     ID_UNIT,
     ID_ORDER_GRAPH_WARES,
     ID_ORDER_GRAPH,
     ID_WARES,
     IS_DEL,
     COEFF) 
   values (
     AUD_ERP.SEQ_A_ORDER_GRAPH_WARES.nextval,
     'D',
     sysdate,
     nvl(sys_context('context',erp.pkg_c.contxt_CHANGE_USER),erp.pkg_sys.Get_UserID),
     erp.pkg_c.vses_JOB_NAME,
     erp.pkg_c.vses_osuser,
     erp.pkg_c.vses_terminal,
     erp.pkg_c.vses_program,
     :old.IS_SEASON,
     :old.QTY_SALE_B7,
     :old.QTY_SALE_B3,
     :old.QTY_SALE_B30,
     :old.ID_CONTRACT,
     :old.ID_UNIT,
     :old.ID_ORDER_GRAPH_WARES,
     :old.ID_ORDER_GRAPH,
     :old.ID_WARES,
     :old.IS_DEL,
     :old.COEFF) ;
 end if ;
end ;

Вот что получилось после

сам триггер
create or replace trigger ERP.TR#A_ORDER_GRAPH_WARES_NEW before insert or update or delete on ERP.ORDER_GRAPH_WARES for each row 
declare
c_old ERP.ORDER_GRAPH_WARES%RowType;
c_new ERP.ORDER_GRAPH_WARES%RowType;
v_is_chnge integer;
begin
  
 if sys_context('context',pkg_c.contxt_DISABLE_AUDIT) = 1 then 
   return ; 
 end if ;

 if INSERTING then
   :new.DATE_OPERATION_AUD     := sysdate ; 
   :new.ID_USER_LOG_CHANGE := nvl(sys_context('context',erp.pkg_c.contxt_CHANGE_USER),erp.pkg_sys.Get_UserID) ;
   :new.JOB_NAME           := pkg_c.vses_JOB_NAME ; 
   :new.OSUSER             := pkg_c.vses_osuser   ; 
   :new.TERMINAL           := pkg_c.vses_terminal ; 
   :new.PROGRAM            := pkg_c.vses_program  ; 
   return ; 
 end if ;


    c_old.ID_USER_LOG_CHANGE:=:old.ID_USER_LOG_CHANGE;
    c_old.JOB_NAME:= :old.JOB_NAME;
    c_old.OSUSER:= :old.OSUSER;
    c_old.TERMINAL:= :old.TERMINAL;
    c_old.PROGRAM:= :old.PROGRAM;
    c_old.PROGRAM:= :old.IS_SEASON;
    c_old.QTY_SALE_B7:= :old.QTY_SALE_B7;
    c_old.QTY_SALE_B3:= :old.QTY_SALE_B3;
    c_old.QTY_SALE_B30:= :old.QTY_SALE_B30;
    c_old.ID_CONTRACT:= :old.ID_CONTRACT;
    c_old.ID_UNIT:= :old.ID_UNIT;
    c_old.ID_ORDER_GRAPH_WARES:= :old.ID_ORDER_GRAPH_WARES;
    c_old.ID_ORDER_GRAPH:= :old.ID_ORDER_GRAPH;
    c_old.ID_WARES:= :old.ID_WARES;
    c_old.IS_DEL:= :old.IS_DEL;
    c_old.COEFF:= :old.COEFF;

    c_new.ID_USER_LOG_CHANGE:=:new.ID_USER_LOG_CHANGE;
    c_new.JOB_NAME:= :new.JOB_NAME;
    c_new.OSUSER:= :new.OSUSER;
    c_new.TERMINAL:= :new.TERMINAL;
    c_new.PROGRAM:= :new.PROGRAM;
    c_new.PROGRAM:= :new.IS_SEASON;
    c_new.QTY_SALE_B7:= :new.QTY_SALE_B7;
    c_new.QTY_SALE_B3:= :new.QTY_SALE_B3;
    c_new.QTY_SALE_B30:= :new.QTY_SALE_B30;
    c_new.ID_CONTRACT:= :new.ID_CONTRACT;
    c_new.ID_UNIT:= :new.ID_UNIT;
    c_new.ID_ORDER_GRAPH_WARES:= :new.ID_ORDER_GRAPH_WARES;
    c_new.ID_ORDER_GRAPH:= :new.ID_ORDER_GRAPH;
    c_new.ID_WARES:= :new.ID_WARES;
    c_new.IS_DEL:= :new.IS_DEL;
    c_new.COEFF:= :new.COEFF;

 if UPDATING then 
   gorohov_v.pr_trg_order_graph_wares(c_old,c_new,'U',v_is_chnge);
  If v_is_chnge=1 Then
     :new.DATE_OPERATION_AUD     := sysdate ; 
     :new.ID_USER_LOG_CHANGE := nvl(sys_context('context',erp.pkg_c.contxt_CHANGE_USER),erp.pkg_sys.Get_UserID) ;
     :new.JOB_NAME           := pkg_c.vses_JOB_NAME ; 
     :new.OSUSER             := pkg_c.vses_osuser   ; 
     :new.TERMINAL           := pkg_c.vses_terminal ; 
     :new.PROGRAM            := pkg_c.vses_program  ; 
  end if ;
 end if ;
 
 if DELETING then
  gorohov_v.pr_trg_order_graph_wares(c_old,c_new,'D',v_is_chnge);
 end if ;
end ;


процедура, которая в нем используется

create or replace procedure gorohov_v.pr_trg_order_graph_wares( c_old in erp.ORDER_GRAPH_WARES%Rowtype, 
                                                                c_new in erp.ORDER_GRAPH_WARES%Rowtype, 
                                                                p_oper_type in varchar,
                                                                p_is_chnge out integer) is
begin
  

 if p_oper_type='U' then 
   if not (
      erp.pkg_sys.DifValue(c_new.IS_SEASON,c_old.IS_SEASON) or
      erp.pkg_sys.DifValue(c_new.QTY_SALE_B7,c_old.QTY_SALE_B7) or
      erp.pkg_sys.DifValue(c_new.QTY_SALE_B3,c_old.QTY_SALE_B3) or
      erp.pkg_sys.DifValue(c_new.QTY_SALE_B30,c_old.QTY_SALE_B30) or
      erp.pkg_sys.DifValue(c_new.ID_CONTRACT,c_old.ID_CONTRACT) or
      erp.pkg_sys.DifValue(c_new.ID_UNIT,c_old.ID_UNIT) or
      erp.pkg_sys.DifValue(c_new.ID_ORDER_GRAPH_WARES,c_old.ID_ORDER_GRAPH_WARES) or
      erp.pkg_sys.DifValue(c_new.ID_ORDER_GRAPH,c_old.ID_ORDER_GRAPH) or
      erp.pkg_sys.DifValue(c_new.ID_WARES,c_old.ID_WARES) or
      erp.pkg_sys.DifValue(c_new.IS_DEL,c_old.IS_DEL) or
      erp.pkg_sys.DifValue(c_new.COEFF,c_old.COEFF) )
   then 
     p_is_chnge:=0;
     return; 
   else 
p_is_chnge:=1;
 insert into AUD_ERP.A_ORDER_GRAPH_WARES(
     ID_AUDIT ,
     TYPE_OPERATION ,
     DATE_OPERATION_AUD ,
     ID_USER_LOG_CHANGE ,
     JOB_NAME ,
     OSUSER ,
     TERMINAL ,
     PROGRAM ,
     IS_SEASON,
     QTY_SALE_B7,
     QTY_SALE_B3,
     QTY_SALE_B30,
     ID_CONTRACT,
     ID_UNIT,
     ID_ORDER_GRAPH_WARES,
     ID_ORDER_GRAPH,
     ID_WARES,
     IS_DEL,
     COEFF) 
 values (
     AUD_ERP.SEQ_A_ORDER_GRAPH_WARES.nextval,
     'U',
     nvl(c_old.DATE_OPERATION_AUD,sysdate),
     c_old.ID_USER_LOG_CHANGE,
     c_old.JOB_NAME,
     c_old.OSUSER,
     c_old.TERMINAL,
     c_old.PROGRAM,
     c_old.IS_SEASON,
     c_old.QTY_SALE_B7,
     c_old.QTY_SALE_B3,
     c_old.QTY_SALE_B30,
     c_old.ID_CONTRACT,
     c_old.ID_UNIT,
     c_old.ID_ORDER_GRAPH_WARES,
     c_old.ID_ORDER_GRAPH,
     c_old.ID_WARES,
     c_old.IS_DEL,
     c_old.COEFF) ;
   end if ;
 end if ;

if p_oper_type='D' then 
   insert into AUD_ERP.A_ORDER_GRAPH_WARES(
     ID_AUDIT ,
     TYPE_OPERATION ,
     DATE_OPERATION_AUD ,
     ID_USER_LOG_CHANGE ,
     JOB_NAME ,
     OSUSER ,
     TERMINAL ,
     PROGRAM ,
     IS_SEASON,
     QTY_SALE_B7,
     QTY_SALE_B3,
     QTY_SALE_B30,
     ID_CONTRACT,
     ID_UNIT,
     ID_ORDER_GRAPH_WARES,
     ID_ORDER_GRAPH,
     ID_WARES,
     IS_DEL,
     COEFF) 
   values (
     AUD_ERP.SEQ_A_ORDER_GRAPH_WARES.nextval,
     'D',
     sysdate,
     nvl(sys_context('context',erp.pkg_c.contxt_CHANGE_USER),erp.pkg_sys.Get_UserID),
     erp.pkg_c.vses_JOB_NAME,
     erp.pkg_c.vses_osuser,
     erp.pkg_c.vses_terminal,
     erp.pkg_c.vses_program,
     c_old.IS_SEASON,
     c_old.QTY_SALE_B7,
     c_old.QTY_SALE_B3,
     c_old.QTY_SALE_B30,
     c_old.ID_CONTRACT,
     c_old.ID_UNIT,
     c_old.ID_ORDER_GRAPH_WARES,
     c_old.ID_ORDER_GRAPH,
     c_old.ID_WARES,
     c_old.IS_DEL,
     c_old.COEFF) ;
 end if ;
end pr_trg_order_graph_wares;


на первый взгляд, я бы не поверил. что второй вариант может работать быстрее классического, но проделав несколько опытов,
убедился что цифры гворят, что первый запорс отработал за 13-14 сек, второй 9-10. Повторов было достаточно.

Так вот вопрос.
1. Есть какое-либо науное обьяснение такому факту? Елси есть, то где почитать?
2. Может кто сталкивался с такого рода задачами, и посоветует как еще возможно оптимизировать код.
3. Кто-то использовал такие конструкции? Может чего посоветуете

Спасибо
4 мар 11, 10:55    [10323994]     Ответить | Цитировать Сообщить модератору
 Re: Использования ХП в триггерах  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8136
Жираф Подвальный
...аудит таблиц надо строить...
create or replace trigger TR#A_ORDER_GRAPH_WARES before insert or update or delete on ERP.ORDER_GRAPH_WARES for each row 
Для аудита испльзуются триггеры типа AFTER
4 мар 11, 11:04    [10324081]     Ответить | Цитировать Сообщить модератору
 Re: Использования ХП в триггерах  [new]
dba123
Member

Откуда:
Сообщений: 1054
Жираф Подвальный
Доброго дня всем!
Триггер является анонимным блоком, т.е. не имеющим имени. Один из знакомых программистов достойный доверия обранил фразу, что аудит таблиц надо строить если не на стандартных ораколовских возможностях, то хотя бы на хранимых процедурах.
К сожалению не успел расспросить как именно. Искал в гугле да и тут - безуспешно.
Решил попробовать сам
...
3. Кто-то использовал такие конструкции? Может чего посоветуете

Спасибо
поиск на форуме по словам
check_val
триггер на логи
generic trigger for auditing column level changes
4 мар 11, 11:13    [10324176]     Ответить | Цитировать Сообщить модератору
 Re: Использования ХП в триггерах  [new]
ybl
Guest
Жираф Подвальный, по первому предложению: Точно, что триггер - анонимный блок? Он не хранится в базе? И TR#A_ORDER_GRAPH_WARES - это не имя?
4 мар 11, 11:25    [10324256]     Ответить | Цитировать Сообщить модератору
 Re: Использования ХП в триггерах  [new]
Жираф Подвальный
Member

Откуда: Киев
Сообщений: 83
ybl
Жираф Подвальный, по первому предложению: Точно, что триггер - анонимный блок? Он не хранится в базе? И TR#A_ORDER_GRAPH_WARES - это не имя?


Преимущество именованного блока в том, что у него есть имя и на него можно ссылаться из других блоков.
На триггер можно ссылаться из других блоков?
Я не спорю, я пытсаюсь выяснить истину
Елси бы я не сомневался, то не создал бы эту тему
Сейчас буду проводить эксперимент на больших обьемах данных
4 мар 11, 11:50    [10324470]     Ответить | Цитировать Сообщить модератору
 Re: Использования ХП в триггерах  [new]
Жираф Подвальный
Member

Откуда: Киев
Сообщений: 83
SQL*Plus,

хм...действительно...имеются и старые :old и новые значения :new. Только новые :new нельзя менять.
И что производительность возрастает по сравнению с before?
Я проверю, но хотелось бы услышать ожидаемый результат
В любом случае спасибо, попробую
4 мар 11, 11:55    [10324512]     Ответить | Цитировать Сообщить модератору
 Re: Использования ХП в триггерах  [new]
ybl
Guest
Жираф Подвальный,
ссылаться на триггер из другого блока - это явным образом запустить его оттуда? Я таких способов не знаю (хотя может они есть?). Только если изменить его состояние (выключить/включить).
Анонимный блок - это блок PL/SQL, который существует в приложении, не имеет имени и не хранится в базе данных. Так что триггер - это точно не анонимный блок, скорее, особый вид хранимой процедуры. Впрочем, это к сути вашего вопроса не относится, это так, к вопросу о терминологии скорее =)
4 мар 11, 12:53    [10325047]     Ответить | Цитировать Сообщить модератору
 Re: Использования ХП в триггерах  [new]
-2-
Member

Откуда:
Сообщений: 15330
ybl
ссылаться на триггер из другого блока - это явным образом запустить его оттуда? Я таких способов не знаю (хотя может они есть?).
M/U/D/I table
4 мар 11, 13:11    [10325192]     Ответить | Цитировать Сообщить модератору
 Re: Использования ХП в триггерах  [new]
ybl
Guest
-2-,
ваши сокращения означают - вызвать триггер, сделав какую-нибудь операцию (кроме select) на данными/таблицей? Это же вроде как неявный вызов, а явный - это если по имени, нет?
4 мар 11, 13:22    [10325264]     Ответить | Цитировать Сообщить модератору
 Re: Использования ХП в триггерах  [new]
Жираф Подвальный
Member

Откуда: Киев
Сообщений: 83
Вобщем грусть печаль
Когда доделал полностью вызов ХП из триггера, оказалось что раотает даже медленнее, примерно на 10%
Подскажите как быть?
Есть JOB который работает по ночам, продолжительность 3 часа примерно
Начальство поставило задачу что бы ждоб отрабатывался хотя бы за 1 час
все процедуры и запросы в них уже отполированы, время выполнения каждого из них не превышает 0,5 сек, стоимость каждого 1,2,3
не больше
Отключив все триггеры, время выполнения зпроса увеличивается в 4 раза
Т.е. я могу сделать вывод что 75% мощности идет на триггер, 25% сам ДЖоб с его запросами. Это врено будет так сказать?
Таким образом, даже оптимизировав запрос и сократив время его выполнения предположим в 2 раза, учитывая что при этом будет обрботано такое же коллличество записей в тех же таблицах, время выполнения джоба сократится всего на 12%
Это примерно верное суждение?

Кто может посоветовать что-либо в данной ситуации?
Спасибо
5 мар 11, 14:44    [10330763]     Ответить | Цитировать Сообщить модератору
 Re: Использования ХП в триггерах  [new]
CV
Member

Откуда:
Сообщений: 56
А вот это - erp.pkg_sys.DifValue - что вообще делает?
5 мар 11, 15:41    [10330993]     Ответить | Цитировать Сообщить модератору
 Re: Использования ХП в триггерах  [new]
Жираф Подвальный
Member

Откуда: Киев
Сообщений: 83
CV
А вот это - erp.pkg_sys.DifValue - что вообще делает?

Функция сравнения двух значений
под каждый тип своя
Если первое значение отличается от второго, то возвращает true иначе false
вобщем если новые значения не отличаются от старых, то не пишем ниче, даже если выктически был update
мне ввообще кажется этот адуит ахрененно тяжелым, но использовать его или нет от меня не зависет

если необходимо могу могу показать внетренности erp.pkg_sys.DifValue
5 мар 11, 19:56    [10331706]     Ответить | Цитировать Сообщить модератору
 Re: Использования ХП в триггерах  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8136
Жираф Подвальный
SQL*Plus,

хм...действительно...имеются и старые :old и новые значения :new. Только новые :new нельзя менять.
И что производительность возрастает по сравнению с before?
Я проверю, но хотелось бы услышать ожидаемый результат
В любом случае спасибо, попробую
Дело не в производительности, а в том, что AFTER-триггер запишет в ваш аудит именно окончательные значения данных, а не какой-то промежуточный результат (представьте, что после вашего BEFORE-триггера сработает какой-то другой BEFORE-триггера, изменяющий данные)
5 мар 11, 20:01    [10331726]     Ответить | Цитировать Сообщить модератору
 Re: Использования ХП в триггерах  [new]
Жираф Подвальный
Member

Откуда: Киев
Сообщений: 83
SQL*Plus
Жираф Подвальный
SQL*Plus,

хм...действительно...имеются и старые :old и новые значения :new. Только новые :new нельзя менять.
И что производительность возрастает по сравнению с before?
Я проверю, но хотелось бы услышать ожидаемый результат
В любом случае спасибо, попробую
Дело не в производительности, а в том, что AFTER-триггер запишет в ваш аудит именно окончательные значения данных, а не какой-то промежуточный результат (представьте, что после вашего BEFORE-триггера сработает какой-то другой BEFORE-триггера, изменяющий данные)


нет. Политика такая - триггеры только для аудита и там в триггере надо заодно изменить данные в самой таблице
:new.OS_USER:= ...имя пользователя
:new.DATE_OPERATION
вопщем в самой таблице что бы были данные о том кто откуда и когда последний раз что-то менял, как мне обьяснили что бы не хранить эту информацию в таблице аудита, а в таблице аудите храть только данные в таком виде, вкотором они были перед изменением

а в триггере AFTER
:new можно только читать
5 мар 11, 20:28    [10331815]     Ответить | Цитировать Сообщить модератору
 Re: Использования ХП в триггерах  [new]
semenar
Member

Откуда: Днепропетровск
Сообщений: 3308
Блог
Жираф Подвальный
Политика такая - триггеры только для аудита и там в триггере
вопщем в самой таблице что бы были данные о том кто откуда и когда последний раз что-то менял

автор
Один из знакомых программистов достойный доверия обранил фразу, что аудит таблиц надо строить если не на стандартных ораколовских возможностях, то хотя бы на хранимых процедурах.

не хотите офф. доку почитать на эту тему? У вас политика такая в организации или все-таки программист достойный доверия источник знаний? Тем более требования меняете на ходу.
5 мар 11, 23:26    [10332630]     Ответить | Цитировать Сообщить модератору
 Re: Использования ХП в триггерах  [new]
Жираф Подвальный
Member

Откуда: Киев
Сообщений: 83
semenar,

почитаю конечно,
а требования не меняю, просто уточняю
еще требование, что бы таблицы аудита были доступны для поиска и запросов с джоинами и т.д.
важно что бы служба эксплуатации могла легко определить первоначальные данные, что, когда и кем поменялось

я сам вообще не сторонник аудита, ну разве что только на этапе тестирования или внедрения, ну так уж получилось, что "работаю на дядю",
может кто имеет опыт, кто тестировал подскажет в 11 R1 или 11 R2 триггеры может стали шустрее работать?
6 мар 11, 01:27    [10333033]     Ответить | Цитировать Сообщить модератору
 Re: Использования ХП в триггерах  [new]
Elic
Member

Откуда:
Сообщений: 29991
Жираф Подвальный
erp.pkg_sys.DifValue - Функция сравнения двух значений
под каждый тип своя
Если первое значение отличается от второго, то возвращает true иначе false
вобщем если новые значения не отличаются от старых, то не пишем ниче, даже если выктически был update
Перебор. STFF
6 мар 11, 04:15    [10333167]     Ответить | Цитировать Сообщить модератору
 Re: Использования ХП в триггерах  [new]
semenar
Member

Откуда: Днепропетровск
Сообщений: 3308
Блог
Жираф Подвальный, если аудит самопальный, то определять вам насколько он доступен и как его использоватm. Если Оракловый, результат работы аудита в подавляющем большинстве случаев расположен в схеме sys и склонен к "разбуханию", что требует организации job+truncate.
6 мар 11, 04:15    [10333168]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить