إنتقال للمحتوى

  • تسجيل الدخول عبر الفيس بوك تسجيل الدخول عبر تويتر Log In with LinkedIn Log In with Google      تسجيل دخول    
  • إنشاء حساب

صورة
- - - - -

سؤال في DB TRIGGER


11 رد (ردود) على هذا الموضوع

#1 masmas

masmas

    مشترك

  • الأعضــاء
  • 60 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 10 December 2005 - 01:49 PM

الأخوة الأعضاء أريد بعد عمل INSERT لجدول معين يقوم بنفس الوقت بعمل INSERT لجدول آخر
والعكس كذلك ارجو المشاركة في هذا الموضوع لأنه ذو اهمية :lol:

#2 alibarg31

alibarg31

    مشترك

  • الأعضــاء
  • 94 مشاركة

تاريخ المشاركة 10 December 2005 - 02:18 PM

TABLE NAME : DEPT
FIELDS : DEPT_NO,DEPT_NAME

CREATE OR REPLACE TRIGGER INSERT_TRIGGER
AFTER INSERT
ON SCOTT.DEPT
FOR EACH ROW
BEGIN
IF INSERTING THEN
INSERT INTO SCOTT.DEPT_TEMP(:NEW.DEPT_NO,:NEW.DEPT_NAME);
END IF;
END;
/
سبحان الله وبحمده سبحان الله العظيم

دعوة صادقة من القلب

#3 masmas

masmas

    مشترك

  • الأعضــاء
  • 60 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 10 December 2005 - 03:04 PM

جزاك الله اخي على مشاركتك الفعالة ولكن السؤال يبقى في اني اريد عمل insert لجدول dept كذلك اذا قمت بعمل insert لجدول DEPT_TEMP الذي افترضته(مثلا)
انا عرف انك باتقوللي انه اعمل نفس الشي بالنسبة للجدول DEPT_TEMP وهو
CREATE OR REPLACE TRIGGER INSERT2_TRIGGER
AFTER INSERT
ON SCOTT.DEPT_TEMP
FOR EACH ROW
BEGIN
IF INSERTING THEN
INSERT INTO SCOTT.DEPT(:NEW.DEPT_NO,:NEW.DEPT_NAME);
END IF;
END;
/
ولكن قد عملت ذلك ولكن يطلع erorr يفيد بأنه لايمكن ذلك
لأنك لو لاحظت معاي بأنه لو قمنا بعمل insert للجدول الأول سوف يقوم بعمل insert للجدول الآخر
وبعد ان يقوم بذلك كانه يريد عمل insert مرة اخري للجدول الأول وهو موجود اصلا فيدخل في loop(هنا مربط الفرس) كيف نحل عقدته؟؟؟؟؟؟؟

#4 أسامة موسى

أسامة موسى

    مشرف سابق وعضو مميز

  • المجموعة الماسية
  • 2,381 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 10 December 2005 - 04:10 PM

السلام عليكم ورحمة الله وبركاته
الاخ الكريم
بالنسبة الى الاصضافة وبنفس الوقت تريد ان تضيف بجدول اخر
اذا كان تنفيذ هذه الاضافة عن طريق الفورم يمكنك استخدام تريجر اسمه post-insert
هذا التريجر يقوم بتنفيذ امر معين بعد عمل inset
لذلك عنما تقوم بعمل insert
قم بانشاء procedure في program units
وضع جملة ال insert ولا تنسى ال commit_forms;

استدعي جملة insert في التريجر post-insert
ارجو ان تكون الفكرة وضحت
۩ اللهـــــــــــــــــــــــم صلي على سيدنا محمد وعلـى آله وصحبه أجمـعين ۩
۩ سبحـــــــــــــــــان الله وبحمده ....... سبحــــــــــــــــــــــــان الله العظيم ۩



يمكنك زيارتي على صفحتي الخاصة بالفيس بوك على الرابط AskOsama

يمكنك زيارتي على مدونتي الجديدة على الرابط http://askossama.blogspot.com

#5 ora_seas

ora_seas

    مشترك

  • الأعضــاء
  • 97 مشاركة

تاريخ المشاركة 11 December 2005 - 12:29 PM

اخي الكريم
اللي فهمته منك ان عندك جدولين
واذا اضفت على اي واحد منهم تبي تضيف على الجول الثاني
اذا كان هذا المطلوب
فتحتاج تنشئ تريجر على الجدولين مثل ماتفضلوا الخوان
لكن تحتاج تشييك بسيط فقط قبل الاضافة اذا القيمة موجودة ولا لا


AFTER INSERT
ON SCOTT.DEPT_TEMP
FOR EACH ROW
BEGIN
select count(*)
into v_i
from scott.dept
where dept_no=:new.dept_no;

if v_i =0 then-- the record is not exist insert it

INSERT INTO SCOTT.DEPT(:NEW.DEPT_NO,:NEW.DEPT_NAME);
END;
end if;

اذا جربت هالطريقة ومامشت او انا مافهمت المطلوب علمني

وشكرا

#6 masmas

masmas

    مشترك

  • الأعضــاء
  • 60 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 11 December 2005 - 01:43 PM

شكرا اخي ora_seas لقد عملت ما قلته ولكن يحدث هنا erorr وهو (ora-06512,ora-04088)
مع العلم اني لو أوقفت احد الترايجر يشتغل تمام فما السبب في ذلك بارك الله في الجميع

#7 ora_seas

ora_seas

    مشترك

  • الأعضــاء
  • 97 مشاركة

تاريخ المشاركة 11 December 2005 - 03:28 PM

اخي الكريم
جربت الطريقة وفعلا طلعت خطأ

وماتقدر تسويها على مستوى التيبل(على حد علمي)
لكن تقدر تسوي فيو من كل جدول
وتحط التريجر على مستوى الفيو

لنفرض عندك هالجدولين
dept
dept_copy

اول خطوة انشئ فيو من كل جدول
create dept_v as select * from dept;

create view dept_copy_v as select * from dept_copy;

ثاني خطوة انشئ تريجر على مستوى الفيو من نوع
INSTEAD OF

على الطريقة التالية

CREATE OR REPLACE TRIGGER TRIG_002 INSTEAD OF INSERT ON DEPTV REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW
declare
v_no number;
BEGIN
insert into dept values(:new.deptno,:new.dept_name);
select count(*)
into v_no
from dept_copy_v
where deptno=:new.deptno;
if v_no=0 then
insert into dept_copy values(:new.deptno,:new.dept_name);
end if;

END;

وننشئ التريجر على الفيو الثانية

CREATE OR REPLACE TRIGGER TRIG_002 INSTEAD OF INSERT ON HR.DEPT_COPY_V REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW
declare
v_no number;
BEGIN
insert into dept_copy values(:new.deptno,:new.dept_name);
select count(*)
into v_no
from dept_v
where deptno=:new.deptno;
if v_no=0 then
insert into dept values(:new.deptno,:new.dept_name);
end if;

END;

والحين اذا اضفت على اي واحدة من الفيو راح تضيف في الجدولين معا

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


اتمنى اني افدتك
وبانتظار ردك

شكرا لك

#8 aza

aza

    عضو نشط

  • الأعضــاء
  • 303 مشاركة

تاريخ المشاركة 12 December 2005 - 09:12 AM

فعلا طريقة الفيووو التي ذكرها الأخ رائعة

شكرا جزيلا لك

#9 ora_seas

ora_seas

    مشترك

  • الأعضــاء
  • 97 مشاركة

تاريخ المشاركة 12 December 2005 - 10:10 AM

العفو اخوي aza

ماشاالله على الصورة اللي تحت اسمك
لياقتها عالية ماتتعب من النط :lol: :lol: :lol:

تحياتي لك

#10 masmas

masmas

    مشترك

  • الأعضــاء
  • 60 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 12 December 2005 - 11:43 AM

اشكرك اخي ORA_SEAS على مشاركتك القيمة هكذا روح التعاون والفكر
واكرر شكري لك وكل من ساهم في هذا المنتدى الرائع والله يوفق الجميع

#11 masmas

masmas

    مشترك

  • الأعضــاء
  • 60 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 12 December 2005 - 11:45 AM

اشكرك اخي ORA_SEAS على مشاركتك القيمة هكذا روح التعاون والفكر
واكرر شكري لك وكل من ساهم في هذا المنتدى الرائع والله يوفق الجميع

#12 ora_seas

ora_seas

    مشترك

  • الأعضــاء
  • 97 مشاركة

تاريخ المشاركة 12 December 2005 - 01:17 PM

العفو اخي masmas

وبدوري اقدم الشكر لكل اعضاء المنتدى على مشاركاتهم الرئعة والمفيدة وحبهم للخير وإفادة الآخرين