Professional Documents
Culture Documents
Triggers in Databases
تتم معاملة القادح والتعليمة التي حفزته كمناقلة واحدة وهي مناقلة يمكن التراجع عنها من داخ ل الق ادح
وذلك في حال حصول خطأ.
توفر مخدمات قواعد البيانات طريقتين أساسيتين لفرض قيود العمل وهما القيود Constraintsوالقادحات .Triggers
تكون القادحات مفيدة في الحاالت التي ال تحقق فيها القيود الحاجات الوظيفية لتطبيق ما:
يمكن للقادحات أن تسلسل التعديالت إلى الجداول المرتبطة ،ولكن هذه السلسلة يمكن فرضها أيض ًا ع بر قي ود
التكامل المرجعي واستخدام التسلسل للقيود المرجعية يكون عادة أكثر فعالية.
يمكن للقادحات أن تفرض القيود المعقدة التي يصعب فرضها باستخدام قيد االختب ار .Check Constraintال يمكن لقي د
االختبار أن يشير إلى أعمدة موجودة في جداول أخرى ،أما القادحات فهي قادرة على ذلك.
يمكن للقادح أن يختبر حالة الجدول قبل وبعد التعديل ،وأن يقوم بعمليات معينة بناء على ذلك.
يمكن إضافة عدة قادحات لنفس نمط التغيير على الجدول.
القادحات االستبدالية :Instead Of Triggersوهي قادحات تنفذ عوضًا عن التغيير األصلي .أي إذا
كان هذا القادح استبدا ً
ال لعملية اإلضافة Insertفال تنفذ عملية اإلضافة وإنما ينفذ القادح عوضًا عن ه.
1
بمعنى آخر لو أردنا أن تتم عمليه اإلضافة األصلية فأن مسؤولية اإلضافة تقع على ع اتق الق ادح (أي
يجب أن نكتب كود االضافة في القادح).
ذه يمكن تعريف القادحات االستبدالية على المناظير متعددة الجداول ،األمر الذي يسمح بتوسيع أنماط التحديث الممكنة عبر ه
المناظير.
القادحات الالحقة :After Triggersوهي قادحات تنفذ بعد نجاح الفع ل المواف ق له ا (Insert,
،) Update, Deleteفي حال فشلت عملية (االضافة أو الحذف أو التعديل) فلن يتم استدعاء الق ادح
الالحق المرتبط.
يتم التحقق من القيود بعد القادحات من النمط Instead Ofوقبل القادحات من النمط .Afterإذا س بب الق ادح
Instead Ofاختراقًا ألحد القيود فإن المناقلة الموافقة له تلغى ،وال يتم تنفيذ القادح Afterالموافق إن وجد.
ه: انتب
يمكن ألي جدول أو منظار أن يحوي قادحًا استبداليًا وحيدًا ،بينما يمكنه أن يحوي عدة قادحات الحقة
خاصة بكل فعل ممكن.
يخزن جدول المحذوفات Deletedنسخة عن السجالت القديم ة المت أثرة بك ل من عملي تي الح ذف
والتعديل.
يخ زن ج دول اإلض افات Insertedنس خة عن الس جالت الجدي دة الناتج ة عن ك ل من عملي تي
اإلضافة والتعديل.
ألنه يعتبر أن عملية التعديل هي حذف للقيم القديمة وإدراج للقيم الجديدة.
افتها أثناء عمليتي الحذف والتعديل يقوم المخدم بحذف السجالت المتأثرة بالعملية من الجدول الموافق وإض
إلى الجدول .Deleted
أثناء عمليتي اإلضافة والتعديل يقوم المخ دم بتخ زين القيم المحدث ة أو الجدي دة للس جالت في الج دول
. Insertedأي أن هذا الجدول يحوي نسخًا من السجالت الجديدة المراد إضافتها إلى الجدول المرتبط.
افات ال بالتالي :جدول المحذوفات ال يحوي أي سجالت للقادحات البديلة عن اإلضافة ،كما أن جدول المض
يحوي أي سجالت للقادحات البديلة عن الحذف.
2
create table Employee_log
( Emp_ID int,
Emp_Name varchar(55),
Emp_Sal decimal(10,2),
Audit_Action varchar(100),
Audit_Timestamp datetime
)
العودية المباشرة :وتحدث عندما ننفذ نفس التعليمة التي فعلت القادح من ضمن القادح مباش رة .مثالً إذا عرفن ا قادح ا ً ب ديالً عن التح ديث TrigU
على الجدول .Tفعندما نجري عملية تحديث لسجالت في Tفإن القادح TrigUينفذ .إذا قمنا ضمن تعري ف الق ادح TrigUبتح ديث الج دول T
مجدداً فإن القادح TrigUينفذ بالعودية المباشرة.
العودية غير المباشرة :وتحدث عندما يحفز القادح المعني قادحا ً آخر معرف على جدول ثان ،الذي يق وم ب دوره بتنفي ذ التعليم ة ال تي فعلت الق ادح
األول مما يؤدي إلى إعادة استدعاء القادح بالعودية غير المباشرة .مثالً نعرف بديل إضافة TrigI1على الجدول T1الذي يستدعي ض منه ق ادح
اإلضافة TrigI2المعرف على الج دول .T2إذا ق ام الق ادح TrigI2بعملي ة إض افة على الج دول T1ف إن الق ادح TrigI1ينف ذ بالعودي ة غ ير
المباشرة.
بشكل عام القادحات ليست عودية ما لم نعط قيمة لخيار قاعدة البيانات RECURSIVE TRIGGERالقيمة .ONإذا وضعنا قيمة هذا الخيار OFF
فإنه يتم منع العودية المباشرة فقط.
لمنع العودية غير المباشرة يجب أن نسند إلى خيار مخدم البيانات nested triggersالقيمة .0
هذا القادح مفيد يقوم القادح البديل عن االستبدال بالتنفيذ عوضا عن فعل اإلضافة العادي المنفذ من قبل المخدم.
عادة لتمكين اإلضافة عبر منظار إلى مجموعة الجداول المضمنة فيه (أو بعضها على األقل).
في مثالنا هنا نقوم بمناقشة الموظف المضاف بشرط أن اليكون راتبه أقل 1000
3
print 'Cannot Insert where salary < 1000 '
ROLLBACK;
end
else
begin
Insert into
Employee (Emp_Name,Emp_Sal)
values (@emp_name,@emp_sal);
Insert into
Employee_log(Emp_ID,Emp_Name,Emp_Sal,Audit_Action,Audit_Timestamp)
values(@@identity,@emp_name,@emp_sal
,@log_action,getdate() );
PRINT 'Record Inserted Successfully .'
END
END
4
update Employee set Emp_Sal = '900' where emp_id = 6
5
insert into Employee_log(Emp_ID,Emp_Name,Emp_Sal,
Audit_Action,Audit_Timestamp)
values (@empid,@empname,@empsal,
@audit_action,getdate());
PRINT 'AFTER INSERT trigger fired.'
يستمر، حتى لو قام القادح االستبدالي بإلغاء عملية االضافة واستبدالها بأي تعليمة أخرى:مالحظة
. وكأن عملية االضافة قد تمت بنجاح،تنفيذ القادح الالحق لعملية االضافة بعد تعليمة االضافة
if update(Emp_Name)
set @audit_action='Update on Emp_name ';
else
if update (Emp_Sal)
set @audit_action='Update on Salary..';
else
if update(Emp_Name)AND update (Emp_Sal)
set @audit_action='Update on Salary and NAme';
insert into
Employee_log (Emp_ID,Emp_Name,Emp_Sal,
Audit_Action,Audit_Timestamp)
values (@empid,@empname,@empsal,
@audit_action,getdate());
PRINT 'AFTER UPDATE trigger fired.'
6
CREATE TRIGGER trgAfterDelete ON dbo.Employee
FOR DELETE
AS
declare @empid int, @empname varchar(55),
;)@empsal decimal(10,2), @audit_action varchar(100
select @empid=d.Emp_ID ;FROM deleted d
;select @empname=d.Emp_Name from deleted d
select @empsal=d.Emp_Sal ;from deleted d
;'select @audit_action='Deleted -- After Delete Trigger.
م أي إذا تغير اسم أي غرض مستخدم في القادح فيجب عندها تعديل القادح بما يتوافق ،لذلك قبل تعديل اس
غرض يجب عرض قائمة األغراض المرتبطة به لتحديد وجود أي قادحات متأثرة بهذا التغيير.
كما يمكن تعديل أي قادح يملكه المستخدم من قبل المستخدم نفسه (حكما في قاعدة البيانات الحالية) كما يمكن
لمدير النظام أن يغير اسم أي قادح ألي مستخدم.
7