Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Не могу разобраться с проблемой в триггерах / 11 сообщений из 11, страница 1 из 1
26.02.2015, 15:25
    #38889576
vup70200
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу разобраться с проблемой в триггерах
Здравствуйте! Не могу понять причину нестабильной работы 2- триггеров.Один и второй просто обновляют одно поле. При чем работает, работает. Потом бах - первый не обновляет поле, а второй вообще делает "кашу" в обновляемом поле.
Сервер - FireBird 2.1
Один.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
CREATE OR ALTER trigger orders_pay_ord_aiud0 for orders_pay_ord
active after insert or update or delete position 0
AS
begin
  /* Trigger text */
  if (inserting) then
   begin
     update orders
     set order_prepay = order_prepay + new.orders_pay_sum
     where id=new.orders_id;
   end
  if (updating) then
   begin
     update orders
     set order_prepay = order_prepay + new.orders_pay_sum
     where id=new.orders_id;

     update orders
     set order_prepay = order_prepay - old.orders_pay_sum
     where id=old.orders_id;
   end
  if (deleting) then
   begin
     update orders
     set order_prepay = order_prepay - old.orders_pay_sum
     where id=old.orders_id;
   end
end


Два
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
CREATE OR ALTER trigger client_pay_sum_aiud1 for client_pay_sum
active after insert or update or delete position 2
AS
 declare variable o_id bigint;
begin
  /* Trigger text */
  if ((inserting)) then
   begin
     select o.id from owners o,mdoc m
     where m.owner_id=o.id and
     m.id = new.doc_id
       into :o_id;
     update owners
     set cash_sum=iif(cash_sum is null, 0, cash_sum)+ new.doc_sum
     where id=:o_id;
   end 
  if ((updating)) then
   begin
     select o.id from owners o,mdoc m
     where m.owner_id=o.id and
     m.id = new.doc_id
       into :o_id;
     update owners
     set cash_sum=iif(cash_sum is null, 0, cash_sum)+ new.doc_sum
     where id=:o_id;

     select o.id from owners o,mdoc m
     where m.owner_id=o.id and
     m.id= old.doc_id
       into :o_id;
     update owners
     set cash_sum=iif(cash_sum is null, 0, cash_sum) - old.doc_sum
     where id=:o_id;

   end
  if ((deleting)) then
   begin
     select o.id from owners o,mdoc m
     where m.owner_id=o.id and
     m.id= old.doc_id
       into :o_id;
     update owners
     set cash_sum=iif(cash_sum is null, 0, cash_sum) - old.doc_sum
     where id=:o_id;
   end
end
...
Рейтинг: 0 / 0
26.02.2015, 16:24
    #38889697
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу разобраться с проблемой в триггерах
Не надо так писать триггера. Совсем не надо.

Значения полям изменяемой записи в BEFORE триггерах можно и нужно просто присваивать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
26.02.2015, 16:28
    #38889708
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу разобраться с проблемой в триггерах
А, пардон, не обратил внимания, что у тебя обновляется другая таблица. Впрочем, хрен
редьки не очень слаще.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
26.02.2015, 16:32
    #38889717
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу разобраться с проблемой в триггерах
vup70200,

первое что я бы на твоём месте сделал, так это когда в триггере отрабатывает if (updating) проверял а реально ли изменились те поля с которыми ты оперируешь и только тогда делал update.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  if (updating) then
   begin
     update orders
     set order_prepay = order_prepay + new.orders_pay_sum
     where id=new.orders_id;

     update orders
     set order_prepay = order_prepay - old.orders_pay_sum
     where id=old.orders_id;
   end



у тебя реально может быть что изменилось одновременно orders_id и orders_pay_sum если да, то неудивительно что твой триггер фигню делает
...
Рейтинг: 0 / 0
26.02.2015, 16:39
    #38889731
vup70200
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу разобраться с проблемой в триггерах
Симонов Денис,

Возможно, но ведь делаю откат по СТАРЫМ значениям ключа обновления. при том пробую несколько раз удалить/обновить/добавить- все пучком. Потом - лажа
...
Рейтинг: 0 / 0
26.02.2015, 16:58
    #38889794
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу разобраться с проблемой в триггерах
vup70200Потом - лажа
Вешай на все три таблицы протоколирующие триггера и потом предметно разбирай протокол: что
за лажа, на каких значениях, при каких обстоятельствах.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.03.2015, 17:31
    #38893900
vup70200
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу разобраться с проблемой в триггерах
Dimitry Sibiryakov,

Пока не повесил. Занят. Но прикол в чем. Смотрю данные - все ссылки правильные, сумма - нет. "Рвет" на одну. Удаляю сумму оплаты - остаток меняется, как положено. Опять оплачиваю документ - опять все пучком. Но перед этим с какого-то сумму не поменяло. Пропустило именно эту
...
Рейтинг: 0 / 0
03.03.2015, 17:38
    #38893919
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу разобраться с проблемой в триггерах
vup70200,

А у тебя только эти 2 триггера? Может там еще какой в цепочке гадит?
...
Рейтинг: 0 / 0
04.03.2015, 09:51
    #38894271
vup70200
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу разобраться с проблемой в триггерах
DarkMaster,

Нету. Пересмотрел всю структуру БД. На моей машине все пашет, на клиента машине - херня.периодически.главное, не все время.глюгает время от времени
...
Рейтинг: 0 / 0
07.03.2015, 12:19
    #38897850
Beton-Karton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу разобраться с проблемой в триггерах
А других триггеров нет, которые могут сработать в твоих случаях? Согласен с предыдущими, убери if(deleting), проверяй конкретные поля
...
Рейтинг: 0 / 0
17.03.2015, 16:06
    #38907299
Не могу разобраться с проблемой в триггерах
А какую сумму не учитывает? Случайно не первую?
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Не могу разобраться с проблемой в триггерах / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]