عند بناء اي نظام متعدد الصلاحيات ومتعدد مستوى الأدخال ومدراء كثيرون على النظام يقومون بأدخال بيانات وحذفها والتعديل عليها في الجداول نحتاج لتسجيل كل عملية لكل مستخدم على قاعدة البيانات حتى نعرف ماذا فعل كل مستخدم او مدير ضمن النظام داخل المشروع من تغيرات على البيانات الجداول .
وبطريقة اخرى .
دائما نحتاج في برامج قواعد البيانات تسجيل كل العمليات التي يقوم بها المستخدمين على قاعدة البيانات من اضافة وحذف وتعديل حتى يكون مدير النظام على بينة بكل عمليات المستخدمين التي يقومون بها على قاعدة البيانات
يوفر لنا SQL Server خاصية تسمى Triggers
Triggers موجودة مع كل جدول تتنفذ تلقائيا عند اجراء عمليات حذف او اضافة او تعديل على الجدول . نكون بيها اجرائات
لتقوم بتسجيل كل تغير على هذا الجدول من اضافة سجل او تعديل سجل او حذف سجل يحدث في الجدول .
مثال : لنفرض ان لدينا جدول اسمه Admins كما في الشكل
UserFillName
|
UserNo
|
Hussien
ahmed talib
|
2
|
Salahm
hamed
|
1
|
Waeel ahmed
|
3
|
Kaeed katib
|
2
|
ونحن نريد تسجيل كل تغير (تحديث) يقوم به المدراء على اي قيد في الجدول يحدث على
1.حقل اسم المستخدم UserFillName
2. حقل
UserNo هو حقل يخزن فيه
ID الخاص بلمدير من جدول AdminManager الذي قام بتغير هذا الاسم
بداية : نضغط على الجدول Admin ومن Triggers نختار اضافة Triggers جديد
نكون TRIGGER جديد
create TRIGGER [dbo].[trgName]
ونجعله يتحكم بلجدول Admin
ON [dbo].[Admin ]
بعد كلمة AFTER نختار العملية (insert,delete,update) الذي نريده ان يرتبط به هذا الأجراء
[dbo].[trgName]
اي متى نريد هذا الاجراء ان يتنفذ عند الحذف او عند التعديل او عند الاضافة في هذا الجدولنجعل هذا TRIGGER الاجراء [dbo].[trgName] يعمل عند التحديث على الجدول نكتب بعد after كلمة Update معناه ينفذ الاجراء بعد كل عملية التعديل على سجل من سجلات الجدول
AFTER UPDATE
في داخل هذا الأجراء نعمل نتحقق على حقل الأسم UserFillName
هل تم تغير البيانات فيه هكذا
IF UPDATE(UserFillName)
BEGIN
END
BEGIN
END
وفي داخل شرط التحقق نجلب :
1. القيمة القديمة Deleted للحقل الأسم UserFillName
2. القيمة الجديدة Inserted للحقل الأسم UserFillName
3. UserNo عنوان ID الخاص بلمدير الذي حدثت البيانات فيه
1. القيمة القديمة Deleted للحقل الأسم UserFillName
2. القيمة الجديدة Inserted للحقل الأسم UserFillName
3. UserNo عنوان ID الخاص بلمدير الذي حدثت البيانات فيه
SELECT @OldDate = (SELECT UserFillName FROM Deleted)
SELECT @NewDate = (SELECT UserFillName FROM Inserted)
SELECT @NewDate = (SELECT UserFillName FROM Inserted)
SELECT @UserNo = (SELECT UserNo FROM Inserted)
وبعدها نرسل البيانات التي حصل عليها التحديث الى اجراء الحفظ في جدول
TabelHistory لكل نحفظ التغيرات على بيانات الحقل في صف جديد في الجدول
exec dbo.InsertHistory @OldDate,@NewDate,@UserNo
كود
TRIGGER
الاجراء [dbo].[trgName]
كامل
create TRIGGER [dbo].[trgName]
ON [dbo].[Admin ]AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @OldDate nvarchar(40)
DECLARE @NewDate nvarchar(40)
DECLARE @UserNo int
IF UPDATE(UserFillName)
BEGIN
SELECT @OldDate = (SELECT UserFillName FROM Deleted)
SELECT @NewDate = (SELECT UserFillName FROM Inserted)
SELECT @UserNo = (SELECT UserNo FROM Inserted)
IF @OldDate <> @NewDate
BEGIN
exec dbo.InsertHistory @OldDate,@NewDate,@UserNo
END
END
END
create PROCEDURE [dbo].[InsertHistory]
(@OldName varchar(40),@NewName varchar(40) ,@UserNo int )
AS
BEGIN
SET NOCOUNT ON;
Insert into dbo.TabelHistory
([ OldName ],[ NewName ],[UserNo])
Values
( @ OldName ,@ NewName ,@UserNo )
END
(@OldName varchar(40),@NewName varchar(40) ,@UserNo int )
AS
BEGIN
SET NOCOUNT ON;
Insert into dbo.TabelHistory
([ OldName ],[ NewName ],[UserNo])
Values
( @ OldName ,@ NewName ,@UserNo )
END
جدول TabelHistory الذي يخزن به حركات المستخدمين وتعديلاتهم على الجداول
OldName
|
NewName
|
UserNo
|
Hussien
ahmed talib
|
Hussien ahmed
|
1
|
Salahm
hamed
|
Salahm hamed najam
|
1
|
جدول AdminManager
وهذا الجدول خاص بأسماء المدراء الحقيقية وID الخاص بكل مدير يفيدنا في تحويل ID الخاص بلمدراء الى اسمهم الحقيقي
UserName
|
UserNo
|
Admin1
|
1
|
Admin2
|
2
|
Admin3
|
3
|
Admin4
|
4
|