2010-05-27 60 views
0

我遇到觸發問題。mySQL觸發器在控制檯插入後工作,但在腳本插入後不起作用

我設置了一個觸發器,用於在插入表格後更新其他表格。

如果我從MySQL控制檯進行插入操作,所有工作都正常,但是如果我從外部python腳本插入數據,即使使用相同的數據,觸發器也不會執行任何操作,如下圖所示。

我試圖改變定義者「用戶」 @「%」和「根」 @「%」,但它仍然無所作爲。

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

當通過腳本插入時,你是否「承諾」? – 2010-05-27 14:02:14

回答

1

我認爲它更可能是你遇到未捕獲的錯誤,而不是觸發沒有執行,特別是因爲它從控制檯成功執行。

您需要找出發生錯誤的位置 - 觸發器本身或調用腳本中。

在您的python腳本中,輸出python發送給MySQL執行的SQL語句,以確保它按照您的期望構建 - 例如,如果NEW.type不等於'PRE',觸發器將會已經執行,但不會導致任何更新。

另外請確保您檢查插頁上的錯誤。我不是一個Python程序員,所以我不能告訴你這是怎麼做的,但this似乎是你在找什麼。

如果這兩個都不能解決問題,請將整個if (NEW.type = 'PRE') THEN塊註釋掉,然後做一個簡單的修改,例如將NEW.type設置爲'debug'。確保觸發器確實執行後,再次重新測試,並重新添加更多的實際代碼,直到找出問題。

另外,WRT馬科斯評論,我想如果腳本沒有成功完成後不會自動提交感到驚訝。事實上,我會對任何腳本/語言做出此陳述。

0

對於任何未來發現這個問題的人 - 我猜測解決方法是將mysql autocommit設置爲true。

SET自動提交= 1

+0

我在開啓自動提交功能時遇到類似問題。不知道是否有人遇到這個問題:http://stackoverflow.com/questions/14723533/mysql-after-insert-trigger-keeps-inserting-nulls – Caesar 2013-02-06 18:05:40

0

shell命令僅在控制檯而不是實際的服務器上運行,: 打開以下的連接查詢之後。你可以使用UDF或輪詢來完成你所需要的。