الصفحة الرئيسية

 

المنتديات

 

الدروس التعليمية

 

قسم التصاميم

 

راسلنا

دليل المواقع صندوق الألوان خدماتنا مكتبة الصوتيات مكتبة الخطاط
سجل الزوار صفحة الفريق مكتبة الجافا مكتبة الأدوات مجلة الموقع

 

   
 
دروس الفوتشوب

 

   
 
دروس الفوتشوب

 سلسله دروس PL/SQL:الدرس الثامن (االزنادات)

بسم الله الرحمن الرحيم

تتشابه الزنادات مع البرامج الفرعية الا في الطرق التالية :

* يتم تنفيذ الزنادات ضمنيا,عندما يعدل الجدول بالرغم من عمل المستخدم او التطبيقات على الجدول .

* يتم تعريف الزنادات للجدول الخاص بقاعدة البيانات

* لاتقبل الزنادات المعاملات

تعد الزنادات هامة جدا في تطوير نظم البيانات الموجهة الخاصة بالانتاج .

تركيب الزناد :

create [or replace] Trigger <TRRIGER_NAME>
<before|after] [instead of] trigger event on <table name>
[for Each row [whene triggering restriction]]
<trigger body>

كماهو مع الاجراءات المخزنة امكانية استخدام replace لكي تقوم بالتعديل على الزناد اذا كان موجود ولاتقوم بانشاءه من جديد.
ينفذ التوقيت الخاص بالزناد سواء نفذ الزناد قبل او بعد اغلاق الزناد بواسطة الخيارين before و after , لكن خيار after اكثر كفاءة لان قطع البيانات المؤثرة يجب ان تقراء منطقيا مرة للزناد ومرة لعبارة trigger
ملاحظة/ ان حدث اطلاق الزناد هو جملة sql التي تجعل الزناد وحدث الاطلاق اما update او delete او insert او بكليهما..
ويوجد اربعة انواع من الزنادات:
1- صف after.
2- جملة after.
3- صف before.
4- جملة before.
وكل زناد من اجل جملة update او insert او delete كل زناد يعد نوع واحد من (instead of , after,before) ويمكن تعريف تسع زنادات للجدول الواحد..

* معالجة احداث اطلاق الزناد :
يحتوي حدث اطلاق الزناد على عملية insert او update او delete او على توليفة من هذه العمليات عندما يتعامل زناد واحد مع اكثر من عملية واحدة, فيمكنك ان تستخدم دعائم شرطية للتعرف على نوع العبارة التي تستخدم لتنفيذ الجزء الخاص بالرمز في الزناد
والدعائم هي كمايلي:
IF inserting then .....end if;
IF updating then .....end if;
IF deleting then .....end if;

** لكل صف:
for each row يعد هذا الخيار ما اذا كان الزناد سوف ينطلق مرة واحدة لكل صف تاثر بالزناد
في نص الزناد الخاص بزناد السطر for each row , يمكنك من الوصول الى القيم القديمة والحديثة للصف الحالي حيث في عمليتي insert و update يمكنك الوصول من القيم القديمة والحديثة اما بالنسبة لعملية delete فمن الطبيعي ان المتاح هو القيم القديمة فقط
ويمكنك استخدام القيم القديمة والحديثة في زنادات after و before وسوف تكون القيم القديمة والحديثة هي الموجودة فقط في before trigger .اما اذا كان after trigger فانه يقوم بالتقاط القيمة بعد التحديث.

** قيد الزناد :
يحدد هذا القيد تعبير منطقي يجب ان يكون صحيح كي يطلق الزناد.
على سبيل المثال الزناد التالي stduent_trigger لا يتم حدوثة الا اذا كان رقم الطالب student_id اقل من 100

create or replace trigger stduent_trigger
before insert or update on student
for each row
when(new.student_id<100)

**قيود على انشاء الزنادات:
1- يمكن للنص ان يحتوي على جمل dml sql لكن جمل select يجب ان تكون جمل select into
2- لايسمح بجمل التحكم ( commit,savepoint,rollback)
3-لايمكن لبرنامج فرعي مخزن ان يتضمن جمل التحكم السابقة اذا تم استدعائه بواسطة الزناد.

مـــــــــــــــــثال :

لنفرض انه لدينا الثلاث جداول التالية:

الاول : هو جدول player بيانات جميع اللاعبين في النادي سواء درجة شباب او درجة  ممتاز :

levels address phone date_birth name

no_player

1 riyadh1 123456 11/11/1973 talal 1
2 riyadh2 654321 1/1/1982 mohammed 2
2 riyadh3 123789 1/1/1988 sami 3
1 riyadh4 123123 12/3/1970 yosif 4

حيث level تمثل الدرجة التي يلعب بها اللاعب حيث 1 تمثل الدرجة الاولى الممتاز - و 2 تمثل الشباب .

ولانشاء الجدول كمايلي :

create table player(
no_player varchar2(6) primary key,
name varchar2(50),
date_birth date,
phone varchar2(9),
address varchar2(20),
levels number(2));

الثاني : هو جدول اللاعبين في درجة الممتاز وهو خاص بالرواتب واسم الجدول larg_player

salary level_no no_player
  1 1
  1 4

ولانشاء الجدول كمايلي :

create table larg_player(
no_player varchar2(6) primary key,
level_no number(2),
salary number(7,2));

 

الثالث : هو جدول اللاعبين في درجة الشباب  وهو خاص بالرواتب واسم الجدول youth

salary level_no no_player
  2 2
  2 3

ولانشاء الجدول كمايلي :

create table youth(
no_player varchar2(6) primary key,
level_no number(2),
salary number(7,2));

الان نريد عمل زناد بحيث حينما يقوم المستخدم بادخال اسم لاعب جديد وتحديد مستواه (شباب او ممتاز) يقوم الزناد باختبار المستوى فاذا كان شباب اضاف رقم اللاعب في جدول الشباب وكذلك لوكان مستواه درجة اولى الممتاز فانه يضيف رقم اللاعب في جدول larg_player وبذلك يكون الزناد كمايلي :

create or replace trigger player_age
before insert on player
for each row
begin
if inserting then
if :new.levels=1 then
insert into larg_player(no_player,level_no) values (:new.no_player,:new.levels);
elsif :new.levels=2 then
insert into larg_player(no_player,level_no) values (:new.no_player,:new.levels);
end if;
end if;
end;

بعد ذلك قم بادخال مايلي :

insert into player values('1','talal','11/11/1973','123456','riyadh1',1);

لاحظ ان المدخلات تمت على جدول player  بعد ذلك اذهب وقما بالاستعلام في جدول larg_player سوف تجد انه اضاف رقم اللاعب هناك.

 

لقد يقول احدكم لماذا لاندمج حقل salary الموجود في الجدولين الاخرين مع جدول player ولاداعي لهذا التفصيل فأقول هذا صحيح لكن انا تعمدت ذلك حتى واضح لكم طريقة التعامل مع الزنادات وسوف تشاهدون في بعض الامثلة ان الزنادات تستخدم للتحقق من القيم المدخلة مثلا لديك جدول لتسجيل بيانات اشخاص لكن يشترط ان يكون عمر الشخص الذي تريد تسجيلة اكبر من 16 مثلا فانه لابد من عمل زناد يتحقق من مدخلات هذا الجدول لاختبار عمر الشخص المدخل وسوف تجدون امثلة على ذلك في موضوع الاخ oracle  اضغط هنا

 

شكرا لكم ,,, اخوكم حمد.

1
دروس الجافا
دروس السويش دورة الأوركال
دروس لغة ال php برمجة ال C و ++C
دروس لغة ال ASP دروس اللنكس
دروس الأكسس قواعد البيانات mysql / sql
دروس ال MCSE دروس ال html
دروس الفلاش دروس الفرونت بيج
دروس الفيجوال بيسك دروس وندوز اكس بي
دروس برمجة الدلفي    
     
 

 

     

All Rights Reserved     ©     جميع الحقوق محفوظة

2003

شبكة بكسل

www.pxll.com