Russian Qt Forum

Qt => Базы данных => Тема начата: developer от Февраль 18, 2009, 23:44



Название: Почему не срабатывает триггер
Отправлено: developer от Февраль 18, 2009, 23:44
У меня возникла проблема - есть небольшая сеть (9 компов) и один комп на котором стоит мускуль 5.0.37 и winxp (sp не знаю какой), так вот на етом компе есть база данных, которая имеет несколько триггеров, срабатывают они когда производится вставка или удаление или апдейт некоторой таблицы(только одной) тоесть они вставляють или удаляют записи в некоторую иную таблицу, вот дело в том что ети триггеры срабатывают не всегда, вообще как-то глючно. Какие условия работы могут к етому привести, возможно перегрузить сервер, или переустановить мускуль, или еще что-то... Подскажите пожалуйста, решение нужно найти срочно.


Название: Re: Почему не срабатывает триггер
Отправлено: ритт от Февраль 19, 2009, 01:19
покажи триггер


Название: Re: Почему не срабатывает триггер
Отправлено: developer от Февраль 19, 2009, 14:11
Код:
create trigger insertIntoZayavky after insert on zayavky_zamovnykiv for each row 
begin
insert into zayavky set zayavky.Zajavka_num_zamovnyk = new.id,zayavky.Zamovnyky_id = new.Zamovnyky_id, zayavky.Countrys_id = 1;
insert into zayavky set zayavky.Zajavka_num_zamovnyk = new.id,zayavky.Zamovnyky_id = new.Zamovnyky_id, zayavky.Countrys_id = 2;
end;

create trigger deleteFromZayavky after delete on zayavky_zamovnykiv for each row
begin
delete from zayavky where zayavky.Zajavka_num_zamovnyk = old.id;
end;

create trigger updateInZayavky after update on zayavky_zamovnykiv for each row
begin
update zayavky set zayavky.Zajavka_num_zamovnyk = new.id,zayavky.Zamovnyky_id = new.Zamovnyky_id,zayavky.valuta_id = new.valuta_id where zayavky.Zajavka_num_zamovnyk = old.id;
end;
Вообще-то их  три.


Название: Re: Почему не срабатывает триггер
Отправлено: ритт от Февраль 19, 2009, 17:15
сходу ничего подозрительного не вижу...
а какой именно триггер глючит (или все?)? кроме этих триггеров кто-то ещё пишет в таблицу zayavky? при работе с zayavky используются транзакции?


Название: Re: Почему не срабатывает триггер
Отправлено: developer от Февраль 19, 2009, 18:18
Цитировать
а какой именно триггер глючит (или все?)?
Походу глючит триггер insertIntoZayavky, причем не всегда, где-то у 20% случаев
Цитировать
кроме этих триггеров кто-то ещё пишет в таблицу zayavky?
конечно, в ету таблицу, записывают данные другие пользователи
Цитировать
при работе с zayavky используются транзакции?
транзакции не используются вообще. Да и сама база настроена на неиспользование транзакций

Кстати по поводу етого триггера, он срабатывает как-то пополам - то-есть ета часть(insert into zayavky set zayavky.Zajavka_num_zamovnyk = new.id,zayavky.Zamovnyky_id = new.Zamovnyky_id, zayavky.Countrys_id = 2;) может записаться, ета (insert into zayavky set zayavky.Zajavka_num_zamovnyk = new.id,zayavky.Zamovnyky_id = new.Zamovnyky_id, zayavky.Countrys_id = 1;) нет, или наоборот


Название: Re: Почему не срабатывает триггер
Отправлено: ритт от Февраль 19, 2009, 18:34
так, погоди...а когда триггер не срабатывает должным образом, в zayavky_zamovnykiv запись добавляется? т.е. ошибки триггера не возникает?

а вообще было бы шикарно, если бы предоставил реальный тестовый пример работы с этой базой, дамп базы и конфиг мускуля - можно было бы попробовать определить где именно проблема - в коде или в мускуле.

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


Название: Re: Почему не срабатывает триггер
Отправлено: developer от Февраль 19, 2009, 18:59
Именно, когда добавляется запись в таблицу zayavky_zamovnykiv, тогда триггер не всегда срабатывает, у меня на локале, все проходит без ошибок, но в етой сети ошибки возникают изредка, тоесть на 10 введенных заявок один раз триггер срабатывает криво. Дамп базы могу дать а вот тестовый пример не получится поскольку надо иметь такую же сеть, еще раз повторяю на локале работает без глюков. В таблице zayavky должно быть в два раза больше записей чем в таблице zayavky_zamovnykiv, там такое места не имеет


Название: Re: Почему не срабатывает триггер
Отправлено: developer от Февраль 19, 2009, 19:01
Конфиг мускуля дефолтный , я там ничего не менял, вообещ туда не лез, версия мускуля 5.0.37, возможно отказатьс яот етих триггеров, и использовать транзакции


Название: Re: Почему не срабатывает триггер
Отправлено: ритт от Февраль 19, 2009, 20:17
транзакции и триггера - разные вещи.

если в zayavky_zamovnykiv строка добавляется, значит триггер срабатывает, т.к. при ошибке триггера откатывается весь процесс. значит, тут дело в чём-то другом. одно из предположений - в момент записи из триггера таблица может быть залокирована сторонней записью (но в таком случае вставка должна произойти после снятия блокировки, а тут почему-то триггер выходит из цикла).

нагрузку в сети вполне можно смоделировать и на одной машине - достаточно лишь создать необходимое количество конкурирующих соединений с реальным чтением и записью данных.


Название: Re: Почему не срабатывает триггер
Отправлено: developer от Февраль 20, 2009, 11:54
Ok?  и как быть


Название: Re: Почему не срабатывает триггер
Отправлено: ритт от Февраль 20, 2009, 12:11
попробуй нагрузить на локальной установке...раз пример для моделирования не даёшь