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

Откуда:
Сообщений: 2273
Может кто подскажет как решить проблему.
Есть некое приложение где в экранной форме у записи есть чекбокс, в зависимости от состояния которого в поле (chk_flg char(1)) таблицы (table1) вносится значение '+' или '-'.
В таблице table2 по внешнему ключу (table1.t1_id,table2.t1_id) посредством триггера синхронизируются значения в поле (table2.chk_flg) связанных записей.
И вот тут возникает проблема. Когда обновление делается напрямую командой update в базе - нормально обновляются все связанные записи...
А вот когда тот же самый update выполняется через приложение, то каждый раз не обновляется первая запись. Увы, исходники приложения недоступны.
Внешне отличие одно - первая связанная запись выводится в основной экранной форме. Остальные просто списком в отдельном окне.
27 сен 11, 11:49    [11340365]     Ответить | Цитировать Сообщить модератору
 Re: Как можно вычислить что мешает обновлению записи?  [new]
mod
Member

Откуда:
Сообщений: 2273
Задача найти что мешает записи изменится.
27 сен 11, 11:50    [11340378]     Ответить | Цитировать Сообщить модератору
 Re: Как можно вычислить что мешает обновлению записи?  [new]
Elic
Member

Откуда:
Сообщений: 29991
RTFM sql_trace
27 сен 11, 11:53    [11340415]     Ответить | Цитировать Сообщить модератору
 Re: Как можно вычислить что мешает обновлению записи?  [new]
mod
Member

Откуда:
Сообщений: 2273
Elic,

sql_trace скорее всего не покажет всё же что мешает. И есть некоторые трудности с использованием его.
27 сен 11, 12:19    [11340735]     Ответить | Цитировать Сообщить модератору
 Re: Как можно вычислить что мешает обновлению записи?  [new]
mod
Member

Откуда:
Сообщений: 2273
Можно как-то в триггере прописать запрос на обновление таблицы с отложенным выполнением? Чтобы стартанул после commit?
27 сен 11, 12:53    [11341094]     Ответить | Цитировать Сообщить модератору
 Re: Как можно вычислить что мешает обновлению записи?  [new]
Elic
Member

Откуда:
Сообщений: 29991
mod
Можно как-то в триггере прописать запрос на обновление таблицы с отложенным выполнением? Чтобы стартанул после commit?
Костыль на костыле сидит и костылём погоняет.
27 сен 11, 13:10    [11341238]     Ответить | Цитировать Сообщить модератору
 Re: Как можно вычислить что мешает обновлению записи?  [new]
mod
Member

Откуда:
Сообщений: 2273
Elic,

в данном случае лучше костыль... Система то внегшнего разработчика и поменять в приложении не могу ничего. Только триггер подвесить...
27 сен 11, 14:50    [11342183]     Ответить | Цитировать Сообщить модератору
 Re: Как можно вычислить что мешает обновлению записи?  [new]
stax..
Guest
mod
Может кто подскажет как решить проблему.
Есть некое приложение где в экранной форме у записи есть чекбокс, в зависимости от состояния которого в поле (chk_flg char(1)) таблицы (table1) вносится значение '+' или '-'.
В таблице table2 по внешнему ключу (table1.t1_id,table2.t1_id) посредством триггера синхронизируются значения в поле (table2.chk_flg) связанных записей.
И вот тут возникает проблема. Когда обновление делается напрямую командой update в базе - нормально обновляются все связанные записи...
А вот когда тот же самый update выполняется через приложение, то каждый раз не обновляется первая запись. Увы, исходники приложения недоступны.
Внешне отличие одно - первая связанная запись выводится в основной экранной форме. Остальные просто списком в отдельном окне.

імхо
во время "коммит" кнопки формочка меняет главную таблицу (отрабатывает триггер меняет все подчиненные) и тут же формочка напрямую меняет одну строку заменяя флажок на выставленный в форме

как проверить, ведите лог на подчиненной
как обойти второе изменение, проверять стек вызова (можна флажки выставлять), и игнорить не из триггера

.....
stax
27 сен 11, 14:59    [11342292]     Ответить | Цитировать Сообщить модератору
 Re: Как можно вычислить что мешает обновлению записи?  [new]
mod
Member

Откуда:
Сообщений: 2273
stax..,

Вот затем и идея чтобы после commit основной менялась подчиненная...
27 сен 11, 15:11    [11342410]     Ответить | Цитировать Сообщить модератору
 Re: Как можно вычислить что мешает обновлению записи?  [new]
stax..
Guest
mod
stax..,

Вот затем и идея чтобы после commit основной менялась подчиненная...

по commit знаю только один метод - матвью, но имхо ето черезчур

поропоную, банально проверять стек вызова или выставленный в триггере флажок

.....
stax
27 сен 11, 16:07    [11342976]     Ответить | Цитировать Сообщить модератору
 Re: Как можно вычислить что мешает обновлению записи?  [new]
mod
Member

Откуда:
Сообщений: 2273
stax..,

Мне не слишком поможет если я узнаю кто восстанавливает мне значение в первой записи - убить этот процесс я не смогу. Надо именно обойти.
27 сен 11, 16:20    [11343115]     Ответить | Цитировать Сообщить модератору
 Re: Как можно вычислить что мешает обновлению записи?  [new]
mod
Member

Откуда:
Сообщений: 2273
Может matview и выход. Надо разобраться как работает только.
27 сен 11, 17:25    [11343750]     Ответить | Цитировать Сообщить модератору
 Re: Как можно вычислить что мешает обновлению записи?  [new]
100500
Member

Откуда:
Сообщений: 124
mod
убить этот процесс я не смогу. Надо именно обойти.

Если порядок запросов именно такой (update table1 -> update подчиненных в table2, затем update 1й записи в table2) и ограничения целостности позволяют, то можно в триггере на update table2 принудительно выставлять :new.chk_flg := chk_flg из table1.

Чтобы не нарваться на ORA-04091: table XXXX is mutating, trigger/function may not see it,
надо будет заблокировать работу триггера при "update table1 -> update подчиненных в table2" через флаги пакетов или контекст.
27 сен 11, 18:01    [11344064]     Ответить | Цитировать Сообщить модератору
 Re: Как можно вычислить что мешает обновлению записи?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18399
mod
Надо именно обойти.

Ну если есть желание прикрутить пару костылей...
Успех зависит от того, насколько "умна" форма в приложении, но почему бы не попытаться:

метод1, "авторизуем" update дочерней таблички из триггера на главной посредством "magic sequence":
+
create table ane_test_main(id number primary key, flag char(1 char))
/
create table ane_test_child(id number primary key, fk_id number references ane_test_main(id), flag varchar2(15 char))
/

insert into ane_test_main select rownum, '-' from dual connect by level < 3;
insert into ane_test_child select rownum, mod(rownum,2)+1, '-' from dual connect by level < 11;

create or replace trigger ane_test_main_aur
after update on ane_test_main
for each row
begin
  /* appeng "magic sequence" to the :new.flag variable */
  update ane_test_child set flag = 'from_parent' || :new.flag where fk_id = :old.id;
end;
/

create or replace trigger ane_test_child_bur
before update on ane_test_child
for each row
begin
  /* check if "magic sequence" present */
  if :new.flag like 'from_parent%' then
	  :new.flag := substr(:new.flag,12);
  else
	  :new.flag := :old.flag;
  end if;
end;
/

/* update flag in the main table */
update ane_test_main set flag = '+' where id = 1;

select * from ane_test_child where fk_id = 1;

/* try to update flag in the child table directly */
update ane_test_child set flag = '*' where fk_id = 1;

select * from ane_test_child where fk_id = 1;


метод2, виртуализуем child-табличку:
+
create table ane_test_main(id number primary key, flag char(1 char))
/
create table ane_test_child(id number primary key, fk_id number references ane_test_main(id), flag varchar2(15 char))
/

insert into ane_test_main select rownum, '-' from dual connect by level < 3;
insert into ane_test_child select rownum, mod(rownum,2)+1, '-' from dual connect by level < 11;

/* rename table */
alter table ane_test_child RENAME to ane_test_child_v;

/* create view in place of child table */
create or replace view ane_test_child as select * from ane_test_child_v;

/* change trigger in order to update renamed child table */
create or replace trigger ane_test_main_aur
after update on ane_test_main
for each row
begin
  /*update ane_test_child set flag = :new.flag where fk_id = :old.id;*/
  update ane_test_child_V set flag = :new.flag where fk_id = :old.id;
end;
/

/* "hide" child table from direct updates */
create or replace trigger ane_test_child_iur 
instead of update on ane_test_child
for each row
begin
  NULL;
end;
/

/* update flag trough the main table */
update ane_test_main set flag = '+' where id = 1;

select * from ane_test_child where fk_id = 1;

/* try to update flag in the child table directly */
update ane_test_child set flag = '*' where fk_id = 1;

select * from ane_test_child where fk_id = 1;
27 сен 11, 18:52    [11344369]     Ответить | Цитировать Сообщить модератору
 Re: Как можно вычислить что мешает обновлению записи?  [new]
stax..
Guest
mod
stax..,

Мне не слишком поможет если я узнаю кто восстанавливает мне значение в первой записи - убить этот процесс я не смогу. Надо именно обойти.

Ну зачем убівать, покупная система может ето и не понять
я предлагал банальные или флажки или стек

ps
понимаю шо в жизни ето сложнее

....
stax
27 сен 11, 21:15    [11344928]     Ответить | Цитировать Сообщить модератору
 Re: Как можно вычислить что мешает обновлению записи?  [new]
mod
Member

Откуда:
Сообщений: 2273
andrey_anonymous,

Спасибо за идеи. instead of сразу не катит так как триггеров уже до кучи висит и на главной таблице и на связанной с одной стороны, да вне приложения update с моим триггером прекрасно работает обновляя всё как нужно. Точно не instead of.
28 сен 11, 11:43    [11346857]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить