MySql триггер не срабатывает из приложения

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

MySql триггер не срабатывает из приложения

Сообщение Владимир » 10.12.2015 19:28:00

Всем доброго!
Вопрос связан с использованием SQLDb.
Создаю из приложения на Lazarus триггер на UPDATE записи в БД, он там что-то считает, изменяет поля и создает/иницирует пользовательские переменные в БД, которые потом будут нужны для INSERT в следующую запись.
Код: Выделить всё
s:='CREATE TRIGGER kk_gamma.myTrigUp_7 BEFORE UPDATE ON sg_tank_7 '+
'FOR EACH ROW '+
'BEGIN '+
'DECLARE j INT ;'+
'DECLARE sh_num INT ;'+
'DECLARE m_end,meas Double ;'+
'DECLARE b_beg,b_end,book Double ;'+
'DECLARE old_n_b,n_book Double ;'+
'DECLARE koeff,cur_m,cur_d,cur_koef,old_koef Double ;'+

// расчитываем данные для новой записи
'SET sh_num = (select max(shift_num) from sg_tank_7);'+
'SET old_koef =(select koef from sg_tank_7 where shift_num=sh_num);'+
'SET m_end = (select NEW.meas_end from sg_tank_7 where shift_num=sh_num);'+
'SET b_beg = (select book_beg from sg_tank_7 where shift_num=sh_num);'+
'SET b_end = (select NEW.book_end from sg_tank_7 where shift_num=sh_num);'+
'SET old_n_b = (select book_n from sg_tank_7 where shift_num=sh_num);'+
'SET meas = (select sum(meas_beg - meas_end) from sg_tank_7 where shift_num < sh_num);'+
  //важно для последней записи берем NEW !!!, так как в табл зачений еще нет!!
'SET meas = meas + (select sum(meas_beg - NEW.meas_end) from sg_tank_7 where shift_num = sh_num);'+
//важно для последней записи берем NEW !!!, так как в табл зачений еще нет!!
'SET book = (select sum(koef*(book_beg - book_end)) from sg_tank_7 where shift_num < sh_num);'+
'SET book = book + (select sum(koef*(book_beg - NEW.book_end)) from sg_tank_7 where shift_num = sh_num);'+
'SET koeff = 1.0;'+ //на всякий пож
'SET cur_m = 100000;'+
'SET j=-434;'+
'while j <= 432 do '+
'SET j:=j+1;'+
'SET cur_koef:=1+0.00001*j;'+
'SET cur_d:=book - cur_koef*meas;'+
  'if abs(cur_d) <= cur_m then '+
   'set cur_m=cur_d;'+
   'set koeff:=cur_koef; '+
   'end if;'+
' end while;'+
'SET NEW.flag=2;'+
'SET NEW.book_n=old_n_b - old_koef*(b_beg-b_end);'+
//сделаем пользовательские переменные для новой записи, которая вставится потом по процедуре
'SET @flag_7 = 7;'+
'SET @shift_num_7=sh_num+1;'+
'SET @m_beg_7=m_end;'+
'SET @b_beg_7=b_end;'+
'SET @n_book_7=old_n_b - old_koef*(b_beg-b_end);'+
'SET @n_koef_7=koeff;'+
'END';

При UPDATE из командной строки MySql все работает, а при UPDATE из софта на Lazarus выполняется все до инициализации пользовательских переменных (до SET @flag), т.е. пользовательские не создаются.
Кроме того, из Lazarus нельзя прочитать пользовательские переменные, например запрос
Код: Выделить всё
select @flag_7

не возвращает ничего, а в консоли все Ок...
p.s. В консоли я из под root, а в приложении - user, однако в свойствах SQLConnection установлен root, ведь позволено же создавать триггер.
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: MySql триггер не срабатывает из приложения

Сообщение wavebvg » 11.12.2015 10:08:24

@flag - это не пользовательская переменная, а переменная сессии. Делайте
Код: Выделить всё
select @flag_7

Из своей программы :-D
wavebvg
постоялец
 
Сообщения: 355
Зарегистрирован: 28.02.2008 04:57:35

Re: MySql триггер не срабатывает из приложения

Сообщение Владимир » 11.12.2015 10:54:02

Ну пусть сессионные, я ж писал, что SELECT @flag из приложения ничего невозвращает!
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: MySql триггер не срабатывает из приложения

Сообщение Снег Север » 11.12.2015 16:08:34

Для Mysql есть отличная утилита - hedisql. Запускаете соединение под вашим юзером, выполняете запросы и видите, что и почему не работает. Я этой утилитой пользуюсь уже много лет.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3053
Зарегистрирован: 27.11.2007 16:14:47


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 247

Рейтинг@Mail.ru
cron