MySQL Trigger работает после вставки консоли, но не после вставки скрипта - PullRequest
0 голосов
/ 27 мая 2010

У меня проблема с триггером.

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

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

Я попытался изменить определитель на '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
//

Ответы [ 3 ]

1 голос
/ 27 мая 2010

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

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

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

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

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

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

0 голосов
/ 24 сентября 2013

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

0 голосов
/ 14 ноября 2011

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

SET autocommit = 1

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