الزناد MySQL يتدلى من سطر الأوامر

لدي مشغل mySQL على جدول قاعدة البيانات. عندما يتم تحديث الجدول من تطبيق يتصل بقاعدة البيانات من خلال PHP ، يتم تشغيل المشغل بشكل مثالي ويتم تحديثه. ومع ذلك ، إذا حاولت تحديث صف في هذا الجدول باستخدام سطر الأوامر mySQL في phpMyAdmin ، فستبدو قاعدة البيانات معلقة؟ لا استطيع معرفة مدى الحياة التي تسببها ، أو حتى كيفية تصحيح هذا. هيريس على الزناد إذا كان أي شخص يمكن أن يرى أي شيء واضح (أو حتى كيف لجعلها أكثر كفاءة ، ومحفزات جديدة بالنسبة لي!)!

شكرا مقدما!

DROP TRIGGER IF EXISTS `t_crewstatusupdate`;

DELIMITER //

CREATE TRIGGER `t_crewstatusupdate` AFTER UPDATE ON `crewcallouts`
  FOR EACH ROW
  BEGIN
    DECLARE taxmultiplier INT;
    SET taxmultiplier = ( SELECT t1.taxmultiplier 
                          FROM entities t1, callouts t2 
                          WHERE t1.entityid=t2.entityid 
                            AND t2.calloutid=NEW.calloutid
                        );
    IF NEW.status != OLD.status THEN
      UPDATE callouts 
        SET status = CASE ( SELECT MIN(status) 
                            FROM crewcallouts 
                            WHERE calloutid=NEW.calloutid
                          ) WHEN 1 THEN 1 
                            WHEN 2 THEN 2 
                            WHEN 3 THEN 4 
                            WHEN 4 THEN 4 
                            WHEN 5 THEN 4 
                            WHEN 6 THEN 4 
                            WHEN 7 THEN 7 
                     END 
        WHERE calloutid=new.calloutid;
    END IF;
    UPDATE calloutstats 
      SET netcrewcost = ( SELECT SUM(get_gross_amount(
                                        ( SELECT calloutdate 
                                          from callouts 
                                          WHERE calloutid=NEW.calloutid
                                        ),
                                        ( SELECT starttime 
                                          from callouts 
                                          WHERE calloutid=NEW.calloutid
                                        ),
                                        (workhours + extrahrs),
                                        crewrate,
                                        1, 
                                        IFNULL(travelhours,0)  )
                                    ) 
                          FROM crewcallouts 
                          WHERE calloutid=NEW.calloutid
                        ),
           grosscrewcost = ( SELECT SUM(get_gross_amount((SELECT calloutdate from callouts WHERE calloutid=NEW.calloutid),(SELECT starttime from callouts WHERE calloutid=NEW.calloutid),(workhours + extrahrs),crewrate,1, IFNULL(travelhours,0))
                         * taxmultiplier) 
                             FROM crewcallouts 
                             WHERE calloutid=NEW.calloutid
                           )        
      WHERE calloutid=NEW.calloutid;
  END
//
DELIMITER ;
1
حاول ذلك ، وأحصل على خطأ - # 1422 - غير مسموح به في ارتكاب صريح أو ضمني في الوظيفة المخزنة أو المشغل.
وأضاف المؤلف Cyril Byrne, مصدر
آسف ، حسنا ، لقد حاولت ذلك في بيان التحديث - تحديث crewcallouts SET updatestats = 3 WHERE crewcalloutid = 3؛ ارتكب؛
وأضاف المؤلف Cyril Byrne, مصدر
عذرًا ، لست متأكدًا مما تعنيه بـ "المعرّفة بدون أخطاء" ..
وأضاف المؤلف Cyril Byrne, مصدر
يبدو أن الزناد لا يطلق. يحدث التحديث إلى الجدول على ما يرام ، ولكن يبدو أن مشغل قاعدة البيانات معطلاً. عند إعادة تشغيل الخادم ، يتم تحديث الجدول ولكن لا يتم إجراء التحديثات من المشغل.
وأضاف المؤلف Cyril Byrne, مصدر
صحيح أن المنطق معقد - ولكن عندما يتم تحديث الجدول من كود PHP ، فإن المشغل ينطلق ويستكمل دون أي تأخير ملحوظ ، مع تحديث الجدول عبر سطر الأوامر (مع نفس التحديث) فإنه يتوقف فقط. غريب!
وأضاف المؤلف Cyril Byrne, مصدر
ربما يكون لديك الإعداد AUTOCOMMIT = OFF في envirorment الخاص بسطر الأوامر. هل حاولت القيام COMMIT بعد UPDATE ؟
وأضاف المؤلف ypercubeᵀᴹ, مصدر
لم أقصد أنك وضعت COMMIT في رمز الزناد. بعد تحديث الجدول الخاص بك.
وأضاف المؤلف ypercubeᵀᴹ, مصدر
من المفترض أن يتم تعريف الزناد دون أخطاء. صيح؟
وأضاف المؤلف ypercubeᵀᴹ, مصدر
إذن ، ما حدث عند تشغيل UPDATE crewcallouts SET updatestats = 3 WHERE crewcalloutid = 3؛ ارتكب ؛ </كود> هل اطلاق النار؟
وأضاف المؤلف ypercubeᵀᴹ, مصدر
وتجاهل سؤالي السابق عن الخطأ ، أنت تقول بالفعل أن "المشغل يطلق النار تماما من خلال PHP" ، لذلك تم تعريفها بشكل جيد.
وأضاف المؤلف ypercubeᵀᴹ, مصدر
يبدو أنه ينطلق ولكن يستغرق الكثير من الوقت لإكمال. منطق معقد جدا هناك. متعددة المتداخلة اختيار وظائف.
وأضاف المؤلف ypercubeᵀᴹ, مصدر