2010-05-27 2 views
0

У меня проблема с триггером.mySQL Trigger работает после вставки консоли, но не после вставки сценария

Я установил триггер для обновления других таблиц после вставки в таблицу.

Если я создаю вставку из консоли MySQL, все работает нормально, но если я вставляю, даже с теми же данными, из внешнего скрипта python, триггер ничего не делает, как вы можете видеть ниже.

Я попытался сменить Definer на «user» @ '%' и 'root' @ '%', но он все еще ничего не делает.

mysql> select vid_visit,vid_money from videos where video_id=487; 
+-----------+-----------+ 
| vid_visit | vid_money | 
+-----------+-----------+ 
|  21 |  0.297 | 
+-----------+-----------+ 
1 row in set (0,01 sec) 

mysql> INSERT INTO `table`.`validEvents` (`id` , `campaigns_id` , `video_id` , `date` , `producer_id` , `distributor_id` , `money_producer` , `money_distributor` , `type`) VALUES (NULL , '30', '487', '2010-05-20 01:20:00', '1', '0', '0.009', '0.000', 'PRE'); 
Query OK, 1 row affected (0,00 sec) 

mysql> select vid_visit,vid_money from videos where video_id=487;                 

+-----------+-----------+ 
| vid_visit | vid_money | 
+-----------+-----------+ 
|  22 |  0.306 | 
+-----------+-----------+ 

DROP TRIGGER IF EXISTS `updateVisitAndMoney`// 
CREATE TRIGGER `updateVisitAndMoney` BEFORE INSERT ON `validEvents` 
FOR EACH ROW BEGIN 
    if (NEW.type = 'PRE') THEN 
       SET @eventcash=NEW.money_producer + NEW.money_distributor; 
     UPDATE campaigns SET cmp_visit_distributed = cmp_visit_distributed + 1 , cmp_money_distributed = cmp_money_distributed + NEW.money_producer + NEW.money_distributor WHERE idcampaigns = NEW.campaigns_id; 
     UPDATE offer_producer SET ofp_visit_procesed = ofp_visit_procesed + 1 , ofp_money_procesed = ofp_money_procesed + NEW. money_producer WHERE ofp_video_id = NEW.video_id AND ofp_money_procesed = NEW. campaigns_id; 
     UPDATE videos SET vid_visit = vid_visit + 1 , vid_money = vid_money + @eventcash WHERE video_id = NEW.video_id; 

     if (NEW.distributor_id != '') then 
      UPDATE agreements SET visit_procesed = visit_procesed + 1, money_producer = money_producer + NEW.money_producer, money_distributor = money_distributor + NEW.money_distributor WHERE id_campaigns = NEW. campaigns_id AND id_video = NEW.video_id AND ag_distributor_id = NEW.distributor_id; 
      UPDATE eventForDay SET visit = visit + 1, money = money + NEW. money_distributor WHERE date = SYSDATE() AND campaign_id = NEW. campaigns_id AND user_id = NEW.distributor_id; 
      UPDATE eventForDay SET visit = visit + 1, money = money + NEW.money_producer WHERE date = SYSDATE() AND campaign_id = NEW. campaigns_id AND user_id= NEW.producer_id; 
     ELSE 
      UPDATE eventForDay SET visit = visit + 1, money = money + NEW. money_producer WHERE date = SYSDATE() AND campaign_id = NEW. campaigns_id AND user_id = NEW.producer_id; 
     END IF; 
    END IF; 
END 
// 
+0

При вставке по сценарию вы «совершаете»? –

ответ

1

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

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

В скрипте python распечатайте инструкцию SQL, которую python отправляет в MySQL для выполнения, чтобы убедиться, что она построена так, как вы ожидаете - например, если NEW.type не равен «PRE», триггер будет выполнили, но не приведут к каким-либо обновлениям.

Также убедитесь, что вы проверяете наличие ошибок на вставке. Я не программист на языке python, поэтому я не могу сказать, как это делается, но this похоже на то, что вы ищете.

Если ни один из них не приведет вас к проблеме, закомментируйте весь блок if (NEW.type = 'PRE') THEN и выполните простую модификацию, такую ​​как установка NEW.type для «отладки». Убедившись, что триггер действительно выполняется, повторите попытку с добавлением большего количества реального кода, пока вы не выделите проблему.

Кроме того, комментарий от Маркоса, я был бы удивлен, если сценарий не был автоматически зафиксирован при успешном завершении. В самом деле, я бы сделал это заявление о любом скрипте/языке.

0

Для тех, кто находит этот вопрос в будущем - я предполагаю, что решение устанавливает для mysql autocommit значение true. после открытия запроса соединения следующее:

SET AUTOCOMMIT = 1

+0

У меня есть аналогичная проблема с включенной автозагрузкой. Не уверен, что кто-то здесь столкнулся с этой проблемой: http://stackoverflow.com/questions/14723533/mysql-after-insert-trigger-keeps-inserting-nulls – Caesar

0

Shell команды работают только в консоли, а не на фактическом сервере. Вы можете использовать UDF или опрос, чтобы выполнить то, что вам нужно.

Смежные вопросы