الانتقال إلى المحتوى
View in the app

A better way to browse. Learn more.

مجموعة مستخدمي أوراكل العربية

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

حادثة عجيبة في الحدث Before Insert

Featured Replies

بتاريخ:

السلام عليكم،
تيحة طيبة مباركة لكافة أعضاء المنتدى الكرام.

حقيقة ظاهرة أقل ما يمكن ان اصفها به هي أنها عجيبة غريبة.يحير لها عقل اللبيب.

قمت بانشاء ترايجر ليكن اسمه مثلاً TR1 على الجدول T1 في الحدث Before Insert حيث يقوم هذا التريجر بادخال البيانات أولاً على الجدول T2 ،
وحسب معرفتي بالترايجرات والمعلومات المعفنة التي في رأسي، أن الترايجر في هذه الحالة يقوم أولاً بادخال البيانات في الجدول T2 ثم T1 ، واذا لم تتم العملية بنجاح بأحد الجداول فانها تلغى تماماً،وكأن لم تكن.
وما حدث معي هو ان الترايجر قام بتعبئة الجدول T2 ولم يقم بتعبئة الجدول الرئيسي الذي يحدث عليه الترايجر وهو T1.
فبالله عليكم هل رأيتم أغرب من هذا قط؟
وهل ممكن أن الأوراكل تحدث فيها أخطاء فادحة كهذه.
الأصل اذا كان هناك مشكلة في الترايجر ولم يتم جزء من العملية بنجاح،الأصل ان تلغى العملية بشكل كامل ،وليس أن ينفذ جزء منها.اليس كذلك يا عالم؟
يا جماعة أفيدوني بارك الله فيكم،هل هذا الشيء طبيعي؟أم ان معلوماتي خاطئة؟أرجو الرد السريع والعاجل بارك الله فيكم ولكم،فأخوكم في ورطة بسبب هذه الترايجرات اللعينة.

بتاريخ:

ممكن تضع الكود

بتاريخ:
  • كاتب الموضوع

هذا التريجر الذي اسميناه افتراضاً 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 والذي اساساً العملية الرئيسية تمت عليه.
وطبعاً ليس دائماً ،يعني أحياناً تمشي الحركات بدون مشاكل واحياناً تظهر هذه المشكلة،مما ادى الى لخبطة الأرصدة تماماً،وسبب لي مشكلة وأحراج كبيرين.
الله يجزيكم الخير ، أرجو المساعدة.

بتاريخ:

عند ادخال البياتات على الجدول t1 هل تستخدم نفس المستخدم GOLD
ام مستخدم اخر

بتاريخ:
  • كاتب الموضوع

أخي العزيز سامي،
أشكرك على تفاعلك معي.
نعم المستخدم دائماً هو GOLD في كل الحركات.

بتاريخ:

المشكلة حدثت معي ولكن بشكل اخر وكان المشكلة
عند الاتصال بالمستخدم اخر1 (له كل الصلاحيات عالى جداول المستخدم الرئيسي) وهناك بعض الجداول والتي انشاءت بواسطة المستحدم الاخر1 -ليس المستخدم الرئيسي -والتى لها نفس الاسم فى المستخدم الرئيسي
وعند الاتصال بالمستخدم اخر 1 فان كافة ا البيانات تدخل فى جداول المستخدم الاخر 1.

استخد م فى كافة trigger
raise_application_error لكي تعرف الخطا

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية

Account

Navigation

البحث

إعداد إشعارات المتصفح الفورية

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.