SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 20.04.2011 17:11:18

retro-kharkov
Участник
Зарегистрирован: 18.04.2011
Сообщений: 10

Возможно ли динамическое создание тригера?

Доброго времени суток. Есть таблицы истории создаваемые динамически с наступлением новых суток. Возможно ли динамическое создание тригера внутри процедуры по событию, и т.п.. чтоб вешать на таблицы истории?

Неактивен

 

#2 20.04.2011 21:56:33

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Возможно ли динамическое создание тригера?

А почему нет?

Неактивен

 

#3 20.04.2011 23:11:02

retro-kharkov
Участник
Зарегистрирован: 18.04.2011
Сообщений: 10

Re: Возможно ли динамическое создание тригера?

абстрактно задал вопрос, прошу прощения, вот собственно код



CREATE TABLE `devices_ai220` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `id_device` bigint(20) DEFAULT NULL,
  `dt` datetime DEFAULT NULL,
  `dt_ms` int(11) DEFAULT NULL,
  `persost` int(11) DEFAULT NULL,
  `postsost` int(11) DEFAULT NULL,
  `max` int(11) DEFAULT NULL,
  `min` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`),
  KEY `dt` (`dt`),
  KEY `dt_ms` (`dt_ms`),
  KEY `FK_Reference_devices_ai220_history_devices` (`id_device`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE DEFINER = 'root'@'localhost' PROCEDURE `ai220history`()
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
    create table `deivces_ai220_new` like `devices_ai220`;
   
    set @rename = concat('rename table `devices_ai220` to `devices_ai220_',
    MONTH(ADDDATE(CURDATE(),interval -1 day))*100+DAY(ADDDATE(CURDATE(),interval -1 day)),
    '`, `deivces_ai220_new` to `devices_ai220`');
   PREPARE name FROM @rename;
   EXECUTE name;
   DEALLOCATE PREPARE name;  
   
set @trigger =' CREATE TRIGGER `devices_ai220_before_ins_tr` BEFORE INSERT ON `devices_ai220` '+
  'FOR EACH ROW '+
'BEGIN '+
    'update `last_signals_value_from_devices_history` set `state_per`=NEW.`persost`, `state_post`=NEW.`postsost` where `CAN_DEC`=NEW.`id_device`; '+
    'if DAY(NEW.`dt`)!=DAY(CURDATE()) then '+
        'call `ai220history`; '+
    'end if; END;';
  PREPARE tr FROM @trigger;
   EXECUTE tr;
   DEALLOCATE PREPARE tr;  

END;
 


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

set @trigger =' CREATE TRIGGER `devices_ai220_before_ins_tr` BEFORE INSERT ON `devices_ai220` '+
  'FOR EACH ROW '+
'BEGIN '+
    'update `last_signals_value_from_devices_history` set `state_per`=NEW.`persost`, `state_post`=NEW.`postsost` where `CAN_DEC`=NEW.`id_device`; '+
    'if DAY(NEW.`dt`)!=DAY(CURDATE()) then '+
        'call `ai220history`; '+
    'end if; END;';
  PREPARE tr FROM @trigger;
   EXECUTE tr;
   DEALLOCATE PREPARE tr;  

вот этот код сделаный по аналогии в процедуре не компилиться sad

Неактивен

 

#4 20.04.2011 23:34:32

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Возможно ли динамическое создание тригера?

Да, в процедуре это, к сожалению, сделать не удастся.

К счастью, Ваша задача решается обычным хроном, а триггер тут лишний.
Посмотрите на event scheduler, можно просто вызывать процедуру раз в сутки.

Неактивен

 

#5 21.04.2011 10:24:04

retro-kharkov
Участник
Зарегистрирован: 18.04.2011
Сообщений: 10

Re: Возможно ли динамическое создание тригера?

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

update `last_signals_value_from_devices_history` set `state_per`=NEW.`persost`, `state_post`=NEW.`postsost` where `CAN_DEC`=NEW.`id_device`;

Вот почему у меня такие извращенства sad
в таблицу ложиться приблизительно 10 млн строк в сутки, таких таблиц 4 для каждого типа измерителя напряжения и тока

Отредактированно retro-kharkov (21.04.2011 10:26:18)

Неактивен

 

#6 21.04.2011 16:38:23

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Возможно ли динамическое создание тригера?

Вы не поняли. Обновлять таблицу статистики — одно. Создавать триггер — другое.
Ротировать таблицы в триггере — в любом случае плохое занятие. Если критично
переключать таблицы во время программного события, а не по времени, надо это
делать во время программного события той программой, которая создает это собы-
тие.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson