|
 |
سلسله دروس 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 اضغط
هنا
شكرا لكم ,,, اخوكم
حمد.
|