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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [MySQL]хранимая процедура Vs fork (новый процесс) 
:(
    Опции темы
gcc
Дата 15.8.2009, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 3
Всего: 17



нужно сделать сложные запросы

процедуру SQL что-то не хочется использовать, документации с примерами реально сложными, что-то я не нашел, в любом случае, если сервер глюканет сильно или если выключить ./mysql.server stop, то выполняемые запросы/процедуры в любом оборвутся, правильно?

на много прозрачней, мне кажется форкнуться в новый процесс выполнения, независимое от главного скрипта


и вот такое примерно нужно сделать:
(как сделать в процедуре примерно понял)

 
Код

   $ss = 'SELECT id_se 
    FROM section
    WHERE id = 1';

    while ($id_se = $ss ) {

    $ss2 = 'SELECT id_se
    FROM
      section
    WHERE
      parent_se_id = 13
      
    UNION
      
    SELECT t1.id_se
    FROM
      section t1 JOIN section t2
        ON t1.parent_se_id = t2.id_se
    WHERE
      t2.parent_se_id = 13';

    while ( $id = $ss2 ) {

    DELETE from t1,t2,t3,t4
    where id = $id bla-lba-bla
    }
    }


Это сообщение отредактировал(а) gcc - 15.8.2009, 10:26
PM WWW ICQ Skype GTalk Jabber   Вверх
LSD
Дата 25.8.2009, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: нет
Всего: 538




M
LSD
Перенесено из баз данных



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
gcc
Дата 31.8.2009, 03:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 3
Всего: 17



К примеру есть такая процедура не триггер

Код

declare
  mb dbmail_mailboxes;
  sb bigint;
  _from varchar;
  _fromuser varchar;
  _fromdomain varchar;
  _envelope_from varchar;
  _to varchar;
  _toname varchar;
  _subj varchar;
  _key varchar;
  _tmpl bigint;
begin
  perform warn('on_message ' || new.message_idnr);

  select into mb * from dbmail_mailboxes where mailbox_idnr=new.mailbox_idnr;
  perform warn(mb.owner_idnr || '/' || mb.name || '=' || mb.mailbox_idnr);
  if( mb.name != 'INBOX' )then
    perform warn('not inbox');
    return new;
  end if;
 
  select into _to toaddr from dbmail_tofield where physmessage_id=new.physmessage_id;
  select into _toname toname from dbmail_tofield where physmessage_id=new.physmessage_id;
-- <костыль>
  if not (select count(*)::integer::boolean from dbmail_aliases where deliver_to=mb.owner_idnr::varchar and alias=_to) then
    select into _to ccaddr from dbmail_ccfield where physmessage_id=new.physmessage_id;
    select into _toname ccname from dbmail_ccfield where physmessage_id=new.physmessage_id;
    if not (select count(*)::integer::boolean from dbmail_aliases where deliver_to=mb.owner_idnr::varchar and alias=_to) then
      _toname := '';
      select into _to userid from dbmail_users where user_idnr=mb.owner_idnr;
    end if;
  end if;
-- </костыль>
  select into _from fromaddr from dbmail_fromfield where physmessage_id=new.physmessage_id;
  select into _fromdomain substring(_from from '@(.*)');
  select into _fromuser substring(_from from '(.*?)@');

if not (select count(*)::integer::boolean from user_prefs where user_idnr=mb.owner_idnr and whitelist=true) then 
    return new;  -- Если вайтлист выключен, то записать во входящие
  end if;

  select into _envelope_from headervalue from dbmail_headervalue where (physmessage_id=new.physmessage_id) and (headername_id = 197);
  select into sb spambox from user_prefs where user_idnr=mb.owner_idnr;
perform warn('F='||_from||' T='||_to||' D='||_fromdomain||' U='||_fromuser);
  
if( select id::boolean from dbmail_whitelist where (user_idnr=mb.owner_idnr) and (
       mail=_from
    or mail='@'||_fromdomain
    or mail=_fromdomain
    or _from like '%.'||mail 
  ) limit 1 )then
    return new;   -- Если в локальном вайтлисте - записать в инбокс.
  end if;

  
  if (substring(_to from '@(.*)')=_fromdomain) 
     then  -- Если внутри домена
     if not (substring(_envelope_from from '@(.*)')=_fromdomain) 
       then -- и адрес на конверте не совпадает
       update dbmail_messages set mailbox_idnr=sb where message_idnr=new.message_idnr;  --то в спам
       end if;
     return new; -- а если совпадает, то в инбокс.
  end if;

if( select id::boolean from dbmail_whitelist where (user_idnr=3) and (substring(_envelope_from from '@(.*)')=_fromdomain)and (
       mail=_from
    or mail='@'||_fromdomain
    or mail=_fromdomain
    or _from like '%.'||mail 
  ) limit 1 )then
    return new;   -- Если в глобальном вайтлисте, и адрес на конверте совпадает - записать в инбокс.
  end if;


  if (_fromuser='mail.robot') then -- Если якобы от 'mail.robot'
       if (select count(*)::integer::boolean from domains where domainname=_fromdomain limit 1) then -- и из локального дмена
          if not (substring(_envelope_from from '@(.*)')=_fromdomain) 
             then -- Если адрес на конверте не совпадает
             update dbmail_messages set mailbox_idnr=sb where message_idnr=new.message_idnr;  --то в спам
             end if;
      return new; -- иначе во инбокс
    end if;
  end if;
      

  
perform warn('!-1-!');
    
    update dbmail_messages set mailbox_idnr=sb where message_idnr=new.message_idnr; -- все остальное в спам

    
  select into _subj subjectfield from dbmail_subjectfield where physmessage_id=new.physmessage_id;
  
  select into _tmpl template from user_prefs where user_idnr=mb.owner_idnr;
  perform warn('TMPL='||_tmpl);
  
  if (_toname='') then _toname=_to; end if;
  select into _key captcha(mb.owner_idnr,_from,_toname||' <'||_to||'>',_subj,_tmpl);
  insert into "captcha" ("key",message_idnr,"from","to") values (_key,new.message_idnr,_from,_to);

--  if( _from ~ '<' ) then select into _from substring( _from from '<(.*?>'); end if;
--perform warn('F='||_from);

  
  return new;
end;



есть такой запрос на PgSQL

хотел бы переписать на MySQL и что-то добавить...

можно ли написать это всё например как демон (и держать pool connect)?
или запускать по cron 



Это сообщение отредактировал(а) gcc - 31.8.2009, 07:28
PM WWW ICQ Skype GTalk Jabber   Вверх
DimW
Дата 31.8.2009, 06:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 4
Всего: 44



Цитата(gcc @  15.8.2009,  09:52 Найти цитируемый пост)
 если сервер глюканет сильно или если выключить ./mysql.server stop

а если кувалдой по серваку?! 

Цитата(gcc @  15.8.2009,  09:52 Найти цитируемый пост)
от главного скрипта

что такое главный скрипт?

Цитата(gcc @  31.8.2009,  03:09 Найти цитируемый пост)
или запускать по cron 

у mysql есть свой планировщик.

какова конечная цель? а то от вас только ваши умозаключения, а о том что их породило ни слова.
PM MAIL ICQ   Вверх
gcc
Дата 31.8.2009, 07:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 3
Всего: 17



данный триггер смотрит первое по очереди что добавилось, в зависимости от настроек которые в других таблицах, делает update соответсвующий

мне процедуры не нравятся, я хотел спросить какая разница если не писать это в процедурах, это без разницы что в процедуре или что скрипте?


Это сообщение отредактировал(а) gcc - 31.8.2009, 07:32
PM WWW ICQ Skype GTalk Jabber   Вверх
DimW
Дата 31.8.2009, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 4
Всего: 44



Цитата(gcc @  31.8.2009,  07:31 Найти цитируемый пост)
какая разница 

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

Цитата(gcc @  31.8.2009,  07:31 Найти цитируемый пост)
мне процедуры не нравятся

попробуйте себе обьяснить почему она вам не нравится, быть может мнение изменется. smile

Цитата(gcc @  31.8.2009,  07:31 Найти цитируемый пост)
данный триггер смотрит первое по очереди что 

я просил прокоментировать не логику работы скрипта, а описать сам процесс взаимодействия частей процесса.
PM MAIL ICQ   Вверх
gcc
Дата 31.8.2009, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 3
Всего: 17



Цитата(DimW @ 31.8.2009,  07:45)
а скрипт который выполняется на стороне - это сбоку припека...

если я не ошибась, то в Oracle пишут все в один запрос для того что он может обработать все в один поток...
если в ORM использовать Oracle,  то ORM все время делает один запрос, если я не перепутал

а в MySQL все равно сколько запросов написать хоть 5, хоть 20,  (данный форум делает 30)

в MySQL оно будет медленно из-за того что из скрипта в СУБД отправиться через share memory?

Добавлено @ 21:47
Цитата(DimW @ 31.8.2009,  07:45)
попробуйте себе обьяснить почему она вам не нравится, быть может мнение изменется. smile

прывычка, тогда значит я понял правильней надо в процедуре!

Добавлено @ 21:48
Цитата(DimW @ 31.8.2009,  07:45)
я просил прокоментировать не логику работы скрипта, а описать сам процесс взаимодействия частей процесса.

извините, не понял...

ты имеешь ввиду принцип работы всей программы?

Это сообщение отредактировал(а) gcc - 1.9.2009, 01:56
PM WWW ICQ Skype GTalk Jabber   Вверх
gcc
Дата 1.9.2009, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 3
Всего: 17



еще хотел спросить

вот в PostgreSQL можно в триггер всталвять perl, пямо в триггер

Цитата

Хранимые процедуры и триггеры

Хотя PostgreSQL поддерживает хранимые процедуры и триггеры в течение довольно продолжительного времени, MySQL поддерживает их только в разрабатываемой версии 5.0 и в последующх. Язык запросв PostgreSQL, PL / PgSQL, очень похож на Oracle, PL / SQL. Кроме того, процедуры и триггеры в PostgreSQL могут быть написаны на других языках, например, PL / Tcl, PL / Perl, и PL / Python. Эти дополнительные языки бывают двух основных типов, безопасные и небезопасные. Безопасный позволяет использовать их только в языке программирования, который не влияют на хост системы негативно, как, например, прямой доступ к файловой системе.


мне надо отправить письмо из триггера в MySQL, как только запись вставлена в таблицу, как тут сделать? демона написать который будет смотреть что новое вставилось  и отправлять?
PM WWW ICQ Skype GTalk Jabber   Вверх
Бонифаций
Дата 1.9.2009, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 827
Регистрация: 15.9.2005
Где: Brisbane

Репутация: 20
Всего: 40



Цитата(gcc @  15.8.2009,  09:52 Найти цитируемый пост)

процедуру SQL что-то не хочется использовать, документации с примерами реально сложными, что-то я не нашел, в любом случае, если сервер глюканет сильно или если выключить ./mysql.server stop, то выполняемые запросы/процедуры в любом оборвутся, правильно?

на много прозрачней, мне кажется форкнуться в новый процесс выполнения, независимое от главного скрипта


скрипт оборвется точно также если "сервер глюканет страшно"..

Цитата(gcc @  31.8.2009,  21:46 Найти цитируемый пост)
в MySQL оно будет медленно из-за того что из скрипта в СУБД отправиться через share memory?


mysql не использует shared memory


--------------------
 Бонифаций.
 
PM MAIL ICQ Skype GTalk Jabber YIM   Вверх
DimW
Дата 1.9.2009, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 4
Всего: 44



Цитата(gcc @  1.9.2009,  01:56 Найти цитируемый пост)
мне надо отправить письмо из триггера в MySQL


нашел такие варианты:
1) подключить внешнюю либу на С++
2)выгрузить отправление в файл и использовать средства OC(windows) для отправки почты.
3) воспользоваться шэдулером OC

ну и по этим темат пробегитесь, тынц, быть может еще что полезного найдете.

походу у mysql нет своего API для отправки почты.


Цитата(gcc @  31.8.2009,  21:46 Найти цитируемый пост)
если я не ошибась, то в Oracle пишут все в один запрос для того что он может обработать все в один поток...
если в ORM использовать Oracle,  то ORM все время делает один запрос, если я не перепутал

не совсем понял что вы имели ввиду, и причем тут ORM вообще?

Цитата(gcc @  31.8.2009,  21:46 Найти цитируемый пост)
прывычка, тогда значит я понял правильней надо в процедуре!

понимаете, я вовсе не настаиваю что бы вы поступили именно так, это моя личная позиция, т.к. бизнес логику я реализую на уроне БД.
ну т.е. если часть описания процесса у вас в одном месте, а другая его часть в другом, то с течением времени в этом разбираться будет все сложнее. выберите то что более приемлемо для вас.

Цитата(gcc @  31.8.2009,  21:46 Найти цитируемый пост)
ты имеешь ввиду принцип работы всей программы?

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

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0596 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.