بتاريخ: 4 أبريل 200916 سنة comment_152818 السلام عليكم،تيحة طيبة مباركة لكافة أعضاء المنتدى الكرام.حقيقة ظاهرة أقل ما يمكن ان اصفها به هي أنها عجيبة غريبة.يحير لها عقل اللبيب.قمت بانشاء ترايجر ليكن اسمه مثلاً TR1 على الجدول T1 في الحدث Before Insert حيث يقوم هذا التريجر بادخال البيانات أولاً على الجدول T2 ،وحسب معرفتي بالترايجرات والمعلومات المعفنة التي في رأسي، أن الترايجر في هذه الحالة يقوم أولاً بادخال البيانات في الجدول T2 ثم T1 ، واذا لم تتم العملية بنجاح بأحد الجداول فانها تلغى تماماً،وكأن لم تكن.وما حدث معي هو ان الترايجر قام بتعبئة الجدول T2 ولم يقم بتعبئة الجدول الرئيسي الذي يحدث عليه الترايجر وهو T1.فبالله عليكم هل رأيتم أغرب من هذا قط؟وهل ممكن أن الأوراكل تحدث فيها أخطاء فادحة كهذه.الأصل اذا كان هناك مشكلة في الترايجر ولم يتم جزء من العملية بنجاح،الأصل ان تلغى العملية بشكل كامل ،وليس أن ينفذ جزء منها.اليس كذلك يا عالم؟يا جماعة أفيدوني بارك الله فيكم،هل هذا الشيء طبيعي؟أم ان معلوماتي خاطئة؟أرجو الرد السريع والعاجل بارك الله فيكم ولكم،فأخوكم في ورطة بسبب هذه الترايجرات اللعينة. تقديم بلاغ
بتاريخ: 4 أبريل 200916 سنة كاتب الموضوع comment_152826 هذا التريجر الذي اسميناه افتراضاً TR1على الجدول T1 CREATE OR REPLACE TRIGGER TR1 BEFORE INSERT ON GOLD.T1 REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW BEGIN IF :NEW.TRA_TYPE_ID IN(31,32) THEN ------------------------------- INSERT INTO T2 VALUES (:NEW.BOX_TRA_ID,:NEW.INVOICE_ID,0,:NEW.TRA_AMOUNT,0,'', :NEW.USER_ID,:NEW.TRA_DATE,0,:NEW.CUST_ID,0,:NEW.TRA_AMOUNT, :NEW.TRA_TYPE_ID,2,1,0,0); END IF; END; / ------------ وعلى الجدول T2 يوجد أيضاً ترايجر اسمه TR2 على الحدث BEFORE Insert حيث انه يبدأ بادخال البيانات على الجدول BUIERS_ACCOUNTS CREATE OR REPLACE TRIGGER TR2 BEFORE INSERT ON GOLD.T2 REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW DECLARE AMOUNT_DAEN_YEMENI2 NUMBER:=0; AMOUNT_DAEN_SAUDI2 NUMBER:=0; AMOUNT_MADEN_YEMENI2 NUMBER:=0; AMOUNT_MADEN_SAUDI2 NUMBER:=0; GRAM_DAEN2 NUMBER:=0; GRAM_MADEN2 NUMBER:=0; CHK_BUIER_FOUND NUMBER:=0; LOCK_FLAG NUMBER; LOCK_FLAG2 NUMBER; CHK_MAX_TRA_DATE NUMBER:=0; CHK_MAX_TRA_DATE2 NUMBER:=0; MAX_TRA_DATE DATE; BEGIN IF :NEW.TRA_TYPE_ID IN(19,31,32) AND :NEW.SELL_TYPE=2 THEN SELECT COUNT(BUIER_ID) INTO CHK_BUIER_FOUND FROM BUIERS_ACCOUNTS WHERE BUIER_ID=:NEW.CUST_ID; IF CHK_BUIER_FOUND >0 THEN --------CHECK MAX TRA_DATE--------- SELECT COUNT(BUIER_ID) INTO CHK_MAX_TRA_DATE FROM BUIERS_ACCOUNTS WHERE TRA_DATE=:NEW.TRA_DATE AND BUIER_ID=:NEW.CUST_ID; -------- SELECT COUNT(BUIER_ID) INTO CHK_MAX_TRA_DATE2 FROM BUIERS_ACCOUNTS WHERE TRA_DATE<:NEW.TRA_DATE AND BUIER_ID=:NEW.CUST_ID; ---- IF CHK_MAX_TRA_DATE>0 THEN MAX_TRA_DATE:=:NEW.TRA_DATE; ELSIF CHK_MAX_TRA_DATE2>0 THEN SELECT MAX(TRA_DATE) INTO MAX_TRA_DATE FROM BUIERS_ACCOUNTS WHERE BUIER_ID=:NEW.CUST_ID AND TRA_DATE<:NEW.TRA_DATE; ELSE SELECT MAX(TRA_DATE) INTO MAX_TRA_DATE FROM BUIERS_ACCOUNTS WHERE BUIER_ID=:NEW.CUST_ID; END IF; ----------------- SELECT LOCK_ACCOUNT_FLAG INTO LOCK_FLAG FROM BUIERS_ACCOUNTS WHERE BUIER_ID=:NEW.CUST_ID AND GOLD_SELL_ID= (SELECT MAX(GOLD_SELL_ID) FROM BUIERS_ACCOUNTS WHERE BUIER_ID=:NEW.CUST_ID AND TRA_DATE=MAX_TRA_DATE); IF LOCK_FLAG=0 THEN SELECT GRAM_DAEN,GRAM_MADEN, AMOUNT_DAEN_YEMENI,AMOUNT_DAEN_SAUDI, AMOUNT_MADEN_YEMENI,AMOUNT_MADEN_SAUDI INTO GRAM_DAEN2,GRAM_MADEN2, AMOUNT_DAEN_YEMENI2,AMOUNT_DAEN_SAUDI2, AMOUNT_MADEN_YEMENI2 ,AMOUNT_MADEN_SAUDI2 FROM BUIERS_ACCOUNTS WHERE BUIER_ID=:NEW.CUST_ID AND GOLD_SELL_ID=(SELECT MAX(GOLD_SELL_ID) FROM BUIERS_ACCOUNTS WHERE BUIER_ID=:NEW.CUST_ID AND TRA_DATE=MAX_TRA_DATE); END IF; END IF; IF :NEW.TRA_TYPE_ID=19 THEN -- IF :NEW.CUR_CODE=1 THEN AMOUNT_DAEN_YEMENI2:=AMOUNT_DAEN_YEMENI2+NVL(:NEW.TRA_AMOUNT,0); -- ELSE --AMOUNT_DAEN_SAUDI2:=0; --AMOUNT_DAEN_SAUDI2+NVL(:NEW.INVOICE_AMOUNT,0); -- END IF; AMOUNT_MADEN_YEMENI2:=AMOUNT_MADEN_YEMENI2+NVL(:NEW.INVOICE_AMOUNT,0); --NVL(:NEW.INVOICE_AMOUNT-:NEW.TRA_AMOUNT,0); -- GRAM_DAEN2:=0;--GRAM_DAEN2+NVL(:NEW.INVOICE_GRAM,0); GRAM_MADEN2:=GRAM_MADEN2+NVL(:NEW.INVOICE_GRAM,0); ELSIF :NEW.TRA_TYPE_ID=31 THEN -- IF :NEW.CUR_CODE=1 THEN --AMOUNT_DAEN_YEMENI2:=0; --AMOUNT_DAEN_YEMENI2+NVL(:NEW.TRA_AMOUNT,0); -- ELSE --AMOUNT_DAEN_SAUDI2:=0; --AMOUNT_DAEN_SAUDI2+NVL(:NEW.INVOICE_AMOUNT,0); -- END IF; --GRAM_DAEN2:=0;--GRAM_DAEN2+NVL(:NEW.INVOICE_GRAM,0); AMOUNT_MADEN_YEMENI2:=AMOUNT_MADEN_YEMENI2+NVL(:NEW.TRA_AMOUNT,0); ELSIF :NEW.TRA_TYPE_ID=32 THEN AMOUNT_DAEN_YEMENI2:=AMOUNT_DAEN_YEMENI2+NVL(:NEW.TRA_AMOUNT,0); --IF :NEW.CUR_CODE=1 THEN --AMOUNT_MADEN_YEMENI2:=0; --AMOUNT_MADEN_YEMENI2+NVL(:NEW.INVOICE_AMOUNT-:NEW.TRA_AMOUNT,0); --ELSE --AMOUNT_MADEN_SAUDI2:=0; -- GRAM_MADEN2:=GRAM_MADEN2+NVL(:NEW.INVOICE_GRAM,0); --ELSE --AMOUNT_MADEN_SAUDI2+NVL(:NEW.INVOICE_AMOUNT,0); --END IF; --GRAM_MADEN2:= GRAM_MADEN2+NVL(:NEW.INVOICE_GRAM,0); END IF; IF AMOUNT_DAEN_YEMENI2=AMOUNT_MADEN_YEMENI2 AND AMOUNT_DAEN_SAUDI2=AMOUNT_MADEN_SAUDI2 -- AND --GRAM_DAEN2= GRAM_MADEN2 THEN LOCK_FLAG2:=1; ELSE LOCK_FLAG2:=0; END IF; ------------------------------- INSERT INTO BUIERS_ACCOUNTS VALUES (:NEW.CUST_ID,GRAM_DAEN2,GRAM_MADEN2,AMOUNT_DAEN_YEMENI2, AMOUNT_MADEN_YEMENI2,:NEW.TRA_DATE,AMOUNT_DAEN_SAUDI2, AMOUNT_MADEN_SAUDI2,LOCK_FLAG2,0,:NEW.GOLD_SELL_ID); ------------------------------- UPDATE BUIERS_ACCOUNTS SET GRAM_DAEN=GRAM_DAEN+GRAM_DAEN2, GRAM_MADEN=GRAM_MADEN+GRAM_MADEN2, AMOUNT_DAEN_YEMENI=AMOUNT_DAEN_YEMENI+AMOUNT_DAEN_YEMENI2, AMOUNT_MADEN_YEMENI=AMOUNT_MADEN_YEMENI+AMOUNT_MADEN_YEMENI2, AMOUNT_DAEN_SAUDI=AMOUNT_DAEN_SAUDI+AMOUNT_DAEN_SAUDI2, AMOUNT_MADEN_SAUDI=AMOUNT_MADEN_SAUDI+AMOUNT_MADEN_SAUDI2 --,BUIER_ID=:NEW.BUIER_ID WHERE /*( (GOLD_BUY_ID>=:NEW.GOLD_BUY_ID AND TRA_DATE=:NEW.TRA_DATE) OR (TRA_DATE>:NEW.TRA_DATE) )*/ TRA_DATE>:NEW.TRA_DATE AND BUIER_ID=:NEW.CUST_ID ; --- UPDATE BUIERS_ACCOUNTS SET LOCK_ACCOUNT_FLAG=1 WHERE AMOUNT_DAEN_YEMENI=AMOUNT_MADEN_YEMENI AND AMOUNT_DAEN_SAUDI=AMOUNT_MADEN_SAUDI AND GRAM_DAEN= GRAM_MADEN AND --GOLD_BUY_ID>=:NEW.GOLD_BUY_ID TRA_DATE>=:NEW.TRA_DATE AND BUIER_ID=:NEW.CUST_ID ; ----- UPDATE BUIERS_ACCOUNTS SET LOCK_ACCOUNT_FLAG=0 WHERE (AMOUNT_DAEN_YEMENI<>AMOUNT_MADEN_YEMENI OR AMOUNT_DAEN_SAUDI<>AMOUNT_MADEN_SAUDI OR GRAM_DAEN<> GRAM_MADEN ) AND --GOLD_BUY_ID>=:NEW.GOLD_BUY_ID TRA_DATE>=:NEW.TRA_DATE AND BUIER_ID=:NEW.CUST_ID ; ------------------------------ END IF; END; / يعني الحركة ستكون كالتالي:ادخال على الجدوا T1 يتنفذ القادح TR1 الذي على الجدول T1،والذي يقوم بحركة ادخال على الجدول T2 يتنفذ القادح TR2 الذي على الجدول T2 والذي يقوم بحركة ادخال على الجدول BUIERS_ACCOUNTS الخطأ الذي يحدث هو: يتم ادخال البيانات على الجدول BUIERS_ACCOUNTS وكذلك على الجدول T2ولا يتم ادخالها على الجدول الرئيسي T1 والذي اساساً العملية الرئيسية تمت عليه.وطبعاً ليس دائماً ،يعني أحياناً تمشي الحركات بدون مشاكل واحياناً تظهر هذه المشكلة،مما ادى الى لخبطة الأرصدة تماماً،وسبب لي مشكلة وأحراج كبيرين.الله يجزيكم الخير ، أرجو المساعدة. تقديم بلاغ
بتاريخ: 4 أبريل 200916 سنة comment_152830 عند ادخال البياتات على الجدول t1 هل تستخدم نفس المستخدم GOLDام مستخدم اخر تقديم بلاغ
بتاريخ: 4 أبريل 200916 سنة كاتب الموضوع comment_152838 أخي العزيز سامي،أشكرك على تفاعلك معي.نعم المستخدم دائماً هو GOLD في كل الحركات. تقديم بلاغ
بتاريخ: 4 أبريل 200916 سنة comment_152863 المشكلة حدثت معي ولكن بشكل اخر وكان المشكلةعند الاتصال بالمستخدم اخر1 (له كل الصلاحيات عالى جداول المستخدم الرئيسي) وهناك بعض الجداول والتي انشاءت بواسطة المستحدم الاخر1 -ليس المستخدم الرئيسي -والتى لها نفس الاسم فى المستخدم الرئيسي وعند الاتصال بالمستخدم اخر 1 فان كافة ا البيانات تدخل فى جداول المستخدم الاخر 1.استخد م فى كافة triggerraise_application_error لكي تعرف الخطا تقديم بلاغ
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.