الانتقال إلى المحتوى
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.

مساعدة في : Db Trigger Prevent Duplicate Rows

Featured Replies

بتاريخ:

hالسلام عليكم

 

احاول عمل

DB trigger

 

على جدول ليس عليه اي كونسترينت يحدث له عمليات

insert

بشكل يومي

علما بأن الريكوردات الجديده احيانا تكون موجوده مسبقا لكن ببيانات قديمة

 

اذا : لو كان رقم الموظف على سبيل المثال موجود مسبقا يتم تعديل البيانات الجديده Update

اما لو كان رقم الموظف جديد نضيفة insert

 

جاري معالجه الامر ...

وهذه تجربتي التي لم تنجح بعد


CREATE OR REPLACE TRIGGER DWH_INS
   BEFORE INSERT
   ON EMP1
   FOR EACH ROW
DECLARE
   CURSOR COR
   IS
      SELECT EMPNO
        FROM EMP1;

   VEMP   NUMBER;                                 --WHERE EMPNO=:NEW.EMPNO, ;
BEGIN
   FOR I IN COR
   LOOP
      SELECT EMPNO
        INTO VEMP
        FROM EMP1
       WHERE EMPNO = :NEW.EMPNO;

      IF I.EMPNO = VEMP
      THEN
            /*INSERT INTO EMP1 (EMPNO,

                              ENAME,

                              JOB,

                              MGR,

                              HIREDATE,

                              SAL,

                              COMM,

                              DEPTNO,

                              DNAME,

                              DNAME1

                 VALUES (:NEW.EMPNO,

                         :NEW.ENAME,

                         :NEW.JOB,

                         :NEW.MGR,

                         :NEW.HIREDATE,

                         :NEW.SAL,

                         :NEW.COMM,

                         :NEW.DEPTNO;

         ELSE

         */
         UPDATE EMP1
            SET                                         --EMPNO = :NEW.EMPNO,
               ENAME = :NEW.ENAME,
               JOB = :NEW.JOB,
               MGR = :NEW.MGR,
               HIREDATE = :NEW.HIREDATE,
               SAL = :NEW.SAL,
               COMM = :NEW.COMM,
               DEPTNO = :NEW.DEPTNO
          WHERE EMPNO = :NEW.EMPNO;
      END IF;
   END LOOP;
END;
INSERT INTO EMP1 ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7369, 'SMITH', 'CLERK', 7902,  TO_Date( '12/17/1980 12:00:00 Õ', 'MM/DD/YYYY HH:MI:SS AM')
, 800, NULL, 20); 
INSERT INTO EMP1 ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7499, 'ALLEN', 'SALESMAN', 7698,  TO_Date( '02/20/1981 12:00:00 Õ', 'MM/DD/YYYY HH:MI:SS AM')
, 1600, 300, 30); 
INSERT INTO EMP1 ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7521, 'WARD', 'SALESMAN', 7698,  TO_Date( '02/22/1981 12:00:00 Õ', 'MM/DD/YYYY HH:MI:SS AM')
, 1250, 500, 30); 
INSERT INTO EMP1 ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7566, 'JONES', 'MANAGER', 7839,  TO_Date( '04/02/1981 12:00:00 Õ', 'MM/DD/YYYY HH:MI:SS AM')
, 2975, NULL, 20); 
INSERT INTO EMP1 ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7654, 'MARTIN', 'SALESMAN', 7698,  TO_Date( '09/28/1981 12:00:00 Õ', 'MM/DD/YYYY HH:MI:SS AM')
, 1250, 1400, 30); 
INSERT INTO EMP1 ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7698, 'BLAKE', 'MANAGER', 7839,  TO_Date( '05/01/1981 12:00:00 Õ', 'MM/DD/YYYY HH:MI:SS AM')
, 2850, NULL, 30); 
INSERT INTO EMP1 ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7782, 'CLARK', 'MANAGER', 7839,  TO_Date( '06/09/1981 12:00:00 Õ', 'MM/DD/YYYY HH:MI:SS AM')
, 2450, NULL, 10); 
INSERT INTO EMP1 ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7788, 'SCOTT', 'ANALYST', 7566,  TO_Date( '04/19/1987 12:00:00 Õ', 'MM/DD/YYYY HH:MI:SS AM')
, 3000, NULL, 20); 
INSERT INTO EMP1 ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7839, 'KING', 'PRESIDENT', NULL,  TO_Date( '11/17/1981 12:00:00 Õ', 'MM/DD/YYYY HH:MI:SS AM')
, 5000, NULL, 10); 
INSERT INTO EMP1 ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7844, 'TURNER', 'SALESMAN', 7698,  TO_Date( '09/08/1981 12:00:00 Õ', 'MM/DD/YYYY HH:MI:SS AM')
, 1500, 0, 30); 
INSERT INTO EMP1 ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7876, 'ADAMS', 'CLERK', 7788,  TO_Date( '05/23/1987 12:00:00 Õ', 'MM/DD/YYYY HH:MI:SS AM')
, 1100, NULL, 20); 
INSERT INTO EMP1 ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7900, 'JAMES', 'CLERK', 7698,  TO_Date( '12/03/1981 12:00:00 Õ', 'MM/DD/YYYY HH:MI:SS AM')
, 950, NULL, 30); 
INSERT INTO EMP1 ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7902, 'FORD', 'ANALYST', 7566,  TO_Date( '12/03/1981 12:00:00 Õ', 'MM/DD/YYYY HH:MI:SS AM')
, 3000, NULL, 20); 
INSERT INTO EMP1 ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7934, 'MILLER', 'CLERK', 7782,  TO_Date( '01/23/1982 12:00:00 Õ', 'MM/DD/YYYY HH:MI:SS AM')
, 1300, NULL, 10); 
COMMIT;

تم تعديل بواسطة omogun

بتاريخ:

IF I.EMPNO = VEMP

متهيألي الطبيعي انهم دايما يساووا بعض

الكرسور بيجيب اول قيمة ويحطها في المتغير ده

واول قيمة الي هي i.empno وبتتحط في المتغير

وانت بتقارنهم ببعض

يعني هما هما , والله علم

بتاريخ:

السلام عليكم اخي الكريم
اخي الفاضل : طريقة بناء التريجر نفسه خاطئة
حيث انه فى حالة وجود الموظف بسجل مسبقا
انت هنا تعمل جملة update على السجل القديم بالبيانات الجديدة ، وهذا يحدث بالفعل
ولكن يحدث بعد ذلك ايضا انشاء هذا السجل الجديد الذى حدث من عليه انطلاق هذا الtrigger
فيكون عندك صفين فى قاعدة البيانات متشابهين تماما
صف قديم انت حدثته باليانات الجديدة ، وآخر جديد تم انشاءه

يكفيك ببساطة البحث عن سجل يحمل نفس رقم الموظف واذا وجد تحذفه قبل عملية الinsert

CREATE OR REPLACE TRIGGER dwh_ins
  BEFORE INSERT ON emp1
  FOR EACH ROW
DECLARE
  CURSOR cor IS
    SELECT 1 
    FROM  emp1 
    WHERE empno = :new.empno;
  v_emp NUMBER;
BEGIN
  OPEN cor;
  FETCH cor    INTO v_emp;
  
  IF cor%FOUND
  THEN
    DELETE FROM emp1 
    WHERE  empno = :new.empno;
    CLOSE cor;
  ELSE
    CLOSE cor;
  END IF;
END;

هذا الكود شغال 100%
بالتوفيق

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

جزاك الله الف خير يا

mohamedali013

هو ده المطلوب 

فعلا زي ماقال بيل جيتس

 

Bill Gates — 'I choose a lazy person to do a hard job. Because a lazy person will find an easy way to do it.'

 

وشكراو جزاك الله خير لمرورك

eslam elbyaly

  • بعد 4 أسابيع...
بتاريخ:

السلام عليكم عندي مشكلة عندي جدول في رقم الموعد ولا يوجد عليه اي محددات لكن بصير في كثير من الاحيان تكرار وانا بدي اعمل trigger على نفس الجدول يفحص اذا تم تكرار الدور مباشرة يعدل التكرار 

بتاريخ:

السلام عليكم اخي الكريم

 

اذا تم تكرار الدور مباشرة يعدل التكرار

ماذا تقصد بتعديل التكرار ؟
هل هو كما فى المثال السابق يأخذ قيم جديدة معينة؟
ام يوقف عملية الادخال ويعطي رسالة باستخدام raise_application_error ؟
ام يحذف السجل القديم؟

بتاريخ:

علي فكرة انك تحط primary key  لاي جدول تعمله , ده شئ اساسي في اي داتا بيز , (من مبادئها) .

ابعد دايما عن انك تعمل جدول من غير مفتاح رئيسي

  • بعد 4 أسابيع...
بتاريخ:
  • كاتب الموضوع

 

اخي الكريم المثال فعلا نجح مع بعج الجداول لفتره

ولكن يحدث الخطأ (mutating) التالي لبعض الجداول الاخرى

 

 

ORA-04091: table OWB_TRG.ALL_PRODUCTS_DATA_JUN14 is mutating, trigger/function may not see it

ORA-06512: at "OWB_TRG.DWH_INS_JUN14", line 4

ORA-06512: at "OWB_TRG.DWH_INS_JUN14", line 10

ORA-04088: error during execution of trigger 'OWB_TRG.DWH_INS_JUN14'

 

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

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

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

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

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

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.