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

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

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

Ответить
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

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

Сообщение Владимир »

Всем доброго!
Вопрос связан с использованием 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, ведь позволено же создавать триггер.
wavebvg
постоялец
Сообщения: 355
Зарегистрирован: 28.02.2008 03:57:35

Сообщение wavebvg »

@flag - это не пользовательская переменная, а переменная сессии. Делайте

Код: Выделить всё

select @flag_7 

Из своей программы :-D
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Сообщение Владимир »

Ну пусть сессионные, я ж писал, что SELECT @flag из приложения ничего невозвращает!
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3071
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

Для Mysql есть отличная утилита - hedisql. Запускаете соединение под вашим юзером, выполняете запросы и видите, что и почему не работает. Я этой утилитой пользуюсь уже много лет.
Ответить