powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Не могу разобраться с проблемой в триггерах
11 сообщений из 11, страница 1 из 1
Не могу разобраться с проблемой в триггерах
    #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
Не могу разобраться с проблемой в триггерах
    #38889697
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не надо так писать триггера. Совсем не надо.

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

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

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

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

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


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