السبت، 30 ديسمبر 2017

الدرس الحاي عشر محدد القيمة الفريدة UNIQUE Constraint

محدد القيمة الفريدة UNIQUE Constraint يضمن هذا المحدد ان تكون جميع القيم في الحقل فريدة اي سوف لا يسمح بتكرار نفس القيمة في هذا الحقل في الاسطر المختلفة. مثلا في جدول الزبائن يمكن ان نضيف محدد القيمة الفريدة الى حقل معرف الزبون CUSTOMER_ID
حيث ان هذا الحقل يجب ان يمتلك قيمة فريدة لكل زبون وغير متكررة اي سوف يكون مثل اي وثيقة هوية او جواز سفر يمتلكها الشخص حيث تكون هذه الوثائق ذات ارقام فريدة وغير قابلة للتكرار لذلك بأستخدام هذه الوثائق يمكن التعرف على الاشخاص بسهولة نفس الشيء في جدول الزبائن سوف يكون حقل يكون حقل CUTSOMER_ID معرف الزبون هو مثل وثيقة الهوية او جواز السفر يمتلك قيمة فريد وغير متكررة لكل زبون مثلا اذا كانت القيمة هيه ID0001 فهي تشتيرالى الزبون الاول (Name Ahmed Ali) والقيمة ID0002 تشتير الزبون الى الزبون الثاني (Name Mohammed Omer).
لكي نعرف محدد القيمة الفريدة UNIQUE Constraint اثناء تكوين الجدول سوف نستخم الكلمة UNIQUE ويمكن ان ضعها بعد نوع البيانات في الحقل او بعد معرف القيمة الخالية كما في المثال التالي:
 
 CREATE TABLE CUSTOMER 
(
CUTSOMER_ID VARCHAR (10) NOT NULL UNIQUE,
CUTSOMER_NAME VARCHAR (200) NOT NULL,
CUTSOMER_AGE INT,
CUTSOMER_ADDRESS VARCHAR (3000)
); 
الان وبعد تكوين الجدول اذا حاولنا ان ننفذ عملية ادخال البيانات التالية بأستخدام عبارة INSERT  سوف نحصل على رسالة الخطاء التالية و السبب في رسالة الخطاء هو اننا حاولنا ان نستخدم نفس قيمة معرف الزبون (ID0001) في عبارتي INSERT فمالذي حصل ؟ اولا قام SQL Server بنتفيذ عبارة INSERT الاولى وكما نلاحظ في رسالة الخطاء اول سطر كان يحتوي على عبارة ((1 row(s) affected)) وهذا يعني ان عبارة INSERT الاولى تم تنفيذها بنجاح. عندما انتقل SQL Server الى تنفيذ  عبارة INSERT الثانية حصل الخطاء حيث حاول النظام ان يدخل نفس القيمة (ID0001) ولكن في سطر ثاني وبسبب محدد القيمة الفريدة فأن SQL Server  لم يتمكن من اتمام عبارة  INSERT الثانية بنجاح ورسالة الخطاء كانت واضحة وهي بسبب انتهاك محدد القيمة الخالية (Violation of UNIQUE KEY constraint) .
 
INSERT INTO [CUSTOMERS] ([CUTSOMER_ID] ,[CUTSOMER_NAME],[CUTSOMER_AGE] ,[CUTSOMER_ADDRESS])
VALUES ('ID0001','Ahmed Ali',23,'Iraq Baghdad')

INSERT INTO [CUSTOMERS] ([CUTSOMER_ID] ,[CUTSOMER_NAME],[CUTSOMER_AGE] ,[CUTSOMER_ADDRESS])
VALUES ('ID0001','Mohammed Omer',33,'UAE Abu Dhabi')
 

 
(1 row(s) affected)
Msg 2627, Level 14, State 1, Line 25
Violation of UNIQUE KEY constraint 'UQ__CUSTOMER__6E4B81E6BFB2AF26'. Cannot insert duplicate key in object 'dbo.CUSTOMERS'. The duplicate key value is (ID0001).
The statement has been terminated.

 لتنفيذ كلا العبارتين بشكل صحيح يجب ان نستخدم قيمة فريدة في حقل معرف الزبون لذلك غيرنا عبارة  INSERT الثانية واستخدمنا القيمة (ID0001) وبتالي تمكنا من تنفيذ كلا العبارتين بشكل صحيح.
 
INSERT INTO [CUSTOMERS] ([CUTSOMER_ID] ,[CUTSOMER_NAME],[CUTSOMER_AGE] ,[CUTSOMER_ADDRESS])
VALUES ('ID0001','Ahmed Ali',23,'Iraq Baghdad')

INSERT INTO [CUSTOMERS] ([CUTSOMER_ID] ,[CUTSOMER_NAME],[CUTSOMER_AGE] ,[CUTSOMER_ADDRESS])
VALUES ('ID0002','Mohammed Omer',33,'UAE Abu Dhabi')
 


اضافة محدد القيمة الفريدة UNIQUE Constraint لاكثر من حقل:
يمكن اضافة محدد القيمة الفريدة UNIQUE Constraint لاكثر من حقل واحد في نفس الجدول حيث لا تحديد لعدد محددات القيمة الفريدة UNIQUE Constraint ولكن يجب استخدامها فقط مع الحقول التي تحتاج الى هذه القاعدة.
مثلا من غير المناسب استخدام هذا المحدد مع حقل المدينة لانه من المنطقي ان تمتلك اكثر من زبون من نفس المدينه وبتالي سوف يحتوي جدول الزبائن على اسطر تمتلك نفس القيمة في حقل المدينة.
في المثال التالي سوف نكون جدول زبائن جديد ونستخدم محدد القيمة الفريدة UNIQUE Constraint مع حقلي معرف الزبون CUTSOMER_ID وحقل رقم الهاتف CUTSOMER_MOB وبشكل منفصل 
 
 CREATE TABLE CUSTOMER 
(
CUTSOMER_ID VARCHAR (10) NOT NULL UNIQUE,
CUTSOMER_NAME VARCHAR (200) NOT NULL,
CUTSOMER_AGE INT,
CUTSOMER_ADDRESS VARCHAR (3000),
CUSTOMER_MOB VARCHAR (30) UNIQUE
); 
ويمكن القيام بذلك بطريقة اخرى حيث نستطيع ان نكون محدد قيمة فريدة واحد ولكن يحتوي على حقلين كما في المثال التالي حيث قمنا بتكوين معرف للقيمة الفريدة في نهاية الجدول واستخدمنا حلقين هما رقم الجوال وصندوق البريد وبتالي فأن SQL Server سوف لايسمح بأستخدام نفس رقم الموبايل وصندوق البريد لاكثر من زبون
 
  CREATE TABLE [CUSTOMERS] 
(
CUTSOMER_ID VARCHAR (10) NOT NULL UNIQUE,
CUTSOMER_NAME VARCHAR (200) NOT NULL,
CUTSOMER_AGE INT,
CUTSOMER_ADDRESS VARCHAR (3000),
CUSTOMER_MOB VARCHAR (30), 
CUSTOMER_BOX VARCHAR (30) 
CONSTRAINT CUSID_MOB UNIQUE (CUSTOMER_BOX,CUSTOMER_MOB)
); 



اضافة محدد القيمة الفريدة UNIQUE Constraint لجدول موجود:
في الامثلة السابقة وضحنا كيفية اضافة محدد القيمة الفريدة UNIQUE عند تكوين الجداول ولكن اذا اردنا اضافة هذا المحدد الى جدول موجود سوف نستخدم الايعاز ALTER TABLE  كما في المثال التالي
 
ALTER TABLE [CUSTOMERS] ADD UNIQUE (CUTSOMER_ID)

وفي المثال التالي اضفنا محدد قيمة فريدة يتكون من حقلين حقل الموبايل وصندوق البريد 
 
ALTER TABLE [CUSTOMERS] ADD CONSTRAINT CUSID_MOB UNIQUE (CUSTOMER_BOX,CUSTOMER_MOB)

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

الجمعة، 29 ديسمبر 2017

الدرس العاشر محدد القيمة الخالية NOT NULL Constraint

ان محدد القيمة الخالية NOT NULL Constraint سوف يضمن ادخال قيم في الحقل ولا يسمح بأستخدام القيمة الفارغة (NULL Value) في الحقل.
في حالة عدم استخدام هذا المحدد فأن النظام سوف يقبل القيمة الخالية للحقول في المثال التالي عندما كونا جدول الزبائن لم نستخدم NOT NULL Constraint لذلك يمكن ان نستخدم القيمة الخالية مع كل الحقول وهذا هو التصرف الافتراضي SQL Server اي اذا لم نضيف العبارة  NOT NULL عند تعريف الحقل  فأن النظام يتوقع اننا نريد ان نستخدم القيم الخالية مع الحقول.
 
 CREATE TABLE CUSTOMER 
(
CUTSOMER_ID VARCHAR (10),
CUTSOMER_NAME VARCHAR (200),
CUTSOMER_AGE INT,
CUTSOMER_ADDRESS VARCHAR (3000)
); 
في المثال التالي سوف نكون جدول الزبائن مع استخدام محدد القيمة الخالية مع حقلي المعرف واسم الزبون حيث وضعنا عبارة NOT NULL مباشرة بعد نوع البيانات (مع ترك one space) وهذه هي طريقة تعريف محدد NOT NULL :
 
 CREATE TABLE CUSTOMER 
(
CUTSOMER_ID VARCHAR (10) NOT NULL,
CUTSOMER_NAME VARCHAR (200) NOT NULL,
CUTSOMER_AGE INT,
CUTSOMER_ADDRESS VARCHAR (3000)
); 
الان اذا حاولنا ادخال البيانات بأستخدام عبارة INSERT INTO التالية وحاولنا ادراج قيمة خالية في حقل الاسم ( وذللك لاننا لم نذكر حقل الاسم CUSTOMER_NAME في عبارة INSERT ,وبتالي فأن نظام SQL Server سوف يحاول ان يدرج قيمة خالية في هذا الحقل)
 
 INSERT INTO [CUSTOMERS] ([CUTSOMER_ID] ,[CUTSOMER_AGE] ,[CUTSOMER_ADDRESS])
VALUES ('ID0001',23,'العراق بغداد')

سوف يعيد نظام SQL Server رسالة الخطاء التالية وهي تخبرنا بشكل واضح اننا حاولنا استخدام قيمة خالية في حقل الاسم وأن النظام لاسمح بذلك وبسبب هذا الانتهاك لقاعدة القيمة الخالية فان عملية INSERT لم تحدث.
 
 Msg 515, Level 16, State 2, Line 4
Cannot insert the value NULL into column 'CUTSOMER_NAME', table 'LEARNSQL.dbo.CUSTOMERS'; column does not allow nulls. INSERT fails.
The statement has been terminated.

لكي نتفادى هذا الخطاء يجب ان نذكر حقل الاسم CUSTOMER_NAME في عبارة INSERT وان نعطي قيمة لهذا الحقل كما في المثال التالي
 
INSERT INTO [CUSTOMERS] ([CUTSOMER_ID] ,[CUTSOMER_NAME],[CUTSOMER_AGE] ,[CUTSOMER_ADDRESS])
VALUES ('ID0001','Ahmed Ali',23,'العراق بغداد')




اضافة محدد لقيمة الخالية NOT NULL Constraint الى جدول موجود
شرحنا سابقا كيف نظيف محدد القيمة الخالية اثناء عملية تكوين الجدول ولكن ماذا لوكان الجدول موجود ويحتوي على بيانات ولكن الان نريد اننضيف هذا المحدد ؟ هنا سوف نستخدم عبارة ALTER TABLE ALTER COLUMN في المثال التالي سوف نضيف محدد القيمة الخالية الى حقل العمر في جدول الزبائن و الطريقة بسطية هو بعد عبارة ALTER COLUMN سوف نذكر اسم الحقل ونوع بيانات الحقل ثم نترك مسافة وبعدها نضيف العبارة NOT N وثم ننفذ العبارة وسوف يقوم النظام بأضافة هذا المحدد الى الحقل.
 
ALTER TABLE [CUSTOMERS] ALTER COLUMN [CUTSOMER_AGE] INT NOT NULL

في بعض الاحيان لا تجري الامور بسهولة , مثلا ماذا سوف يحدث اذا كان الحقل الذي نريد ان نضيف اليه محدد القيمة الخالية اصلا يحتوي على قيم خالية , مثلا حقل العنوان في جدول الزبائن كان يقبل القيم الخالية وقد استخدمنا الجدول وادخلنا الالاف من السجلات في هذا الجدول وقسم من السجلات فيها حقل العنوان يحتوي على قيمة NULL 
 
ALTER TABLE [CUSTOMERS] ALTER COLUMN [CUTSOMER_ADDRESS]  [varchar](1000) NOT NULL

ففي هذه الحالة عندما ننفذ الايعاز السابق سوف نحصل على رسالة خطاء التالية وهي تشير الى موجود قيم NULL في حقل العنوان وبتالي فأن SQL Server لم يستطيع اضافة المحدد . 
 
Msg 515, Level 16, State 2, Line 26
Cannot insert the value NULL into column 'CUTSOMER_ADDRESS', table 'LEARNSQL.dbo.CUSTOMERS'; column does not allow nulls. UPDATE fails.
The statement has been terminated.


لكي نحل المشكلةالسابقة علينا ان نبحث على الاسطر التي سببت هذا الخطاء بسبب امتلاكها لقيمة NULL في حقل العنوان ونقوم بأعطاء قيمة عبارة نصية فارغة ('') كقيمة لحقل العنوان الايعاز التالي يعيد الاسطر التي تمتلك قيمة NULL في حقل العنوان. في الايعاز التالي استخدمنا الدالة ( IS NULL) ومعنى الايعاز التالي هو اننا اخبرنا النظام ان يعيد لنا كل الاسطر التي تمتلك قيمة خالية NULL في حقل العنوان. 
 
SELECT * FROM [CUSTOMERS] WHERE [CUTSOMER_ADDRESS] IS NULL 

بعد ان تعرفنا الى عدد الاسطر التي تحتاج الى تحديث (يرجى اخذ الاحتياطات الازمة اما نسخ الجدول احتياطيا او الاحتفاظ بملفات النسخ الاحتياطي لقاعدة البيانات) سوف نقوم بنتفيذ عملية التحديث باستخدام عبارة UPDATE التالية والتي معناها اخبرنا النظام ان يقوم بتغيير قيمة حقل العنوان من NULL Value الى عبارة نصية فارغة ('') او مايعرف ب empty string وهي تختلف عن NULL Value حيث ان النظام يعتبر عبارة نصية فارغة ('')  هي قيمة حقيقية وليست قيمة خالية وهذا مهم جدا.  
 
UPDATE [CUSTOMERS]
SET CUTSOMER_ADDRESS=''
WHERE  [CUTSOMER_ADDRESS] IS NULL 

بعد ان نفذنا الايعاز السابق نستطيع ان ننفذ الا يعاز التالي بنجاح وسوف يقوم SQL Server بأضافة محدد القيمة الخالية الى حقل العنوان وبتالي اي عملية INSERT او UPDATE تحصل بعد اضافة المحدد سوف لن تتم ما لم نعطي قيم لحقل العنوان.
ALTER TABLE [CUSTOMERS] ALTER COLUMN [CUTSOMER_ADDRESS]  [varchar](1000) NOT NULL

الأربعاء، 27 ديسمبر 2017

الدرس التاسع محددات SQL او SQL Constraints

محددات SQL او SQL Constraints هي عبارة عن قواعد تستخدم للتحكم في البيانات التي يتم خزنها في الجدول ولها فوائد كثيرة مثلا يمكن ان نحدد نوع وقيمة البيانات التي يمكن ادخالها في الحقول على سبيل المثال المحدد NOT NULL اذا اضفناه بعد اسم الحقل سوف لا يسمح للمستخدم بترك هذا الحقل فارغ ويجبره على ادخال قيمة في هذا الحقل والا سوف لن تتم عملية اضافة او تعديل البيانات وهذه ميزة مهمة. بصورة عامة ان المحددات سوف تعمل على زيادة دقة البيانات و الوثوقية (accuracy and reliability) واذا حصل اي انتهات اك بين المحددات و عمليات البيانات فأن نظام SQL Server  سوف يلغي هذه العمليات ولايظهر تأثيرها على البيانات. مثلا في جدول الزبائن اذا استخدمنا NOT NULL Constraint مع حقل الاسم فأذا حاول التطبيق او المستخدم ان يكون سجل جديد( عن طريق عبارة INSERT ) وترك الاسم فارغ فان SQL Server سوف يلغي عملية (INSERT) وذلك لان هذه العملية تنتهك القاعدة التي وضعها محدد NOT NULL الا وهي يجب اعطاء قيمة محددة لحقل الاسم. لذلك من السهل فهم المحددات على انها قوانين توضع للتحكم بشكل دقيق في البيانات التي يتم خزنها في الجداول. 
مثال اخر على المحددات التي يمكن اضافتها يمكن اضافة محدد الى حقل العمر في جدول الزبائن والذي كان عبارة عن حقل من نوع رقم صحيح (CUTSOMER_AGE INT) للتحكم بقيمة البيانات بحيث تسمح فقط بأدخال القيم العددية التي تكون اكبر من الصفر. رغم الفوائد الكثيرة للمحددات يجب كذلك استخدامها بحكمة لان الاكثار من المحددات (الغير ضرورية) قد يؤدي الى اثار غير مرغوبة مثلا صعوبة ادخال وتعديل البيانات في الجداول وبعض الاحيان قد تؤدي الى بطىء في عمل النظام خصوصا في الانظمة التي تتعامل مع كم هائل من البيانات وبشكل متزامن. 
هناك العديد من المحددات وسوف نشرحها في مواضيع منفصلة لاهميتها وفي ما يلي قائمة بأنواع المحددات والاستخدامات العامة لها 
  • NOT NULL يضمن ادخال قيم في الحقل ولا يسمح بأستخدام القيمة الفارغة (NULL Value) في الحقل.
  • UNIQUE يضمن ان تكون جميع القيم في الحقل فريدة ولا يسمح بتكرار القيم وهذه من خصائص PRIMARY KEY او المقتاح الاساسي.
  • PRIMARY KEY  المفتاح الاساسي من اهم المحددات وهو يمزج بين المحددين NOT NULL  و UNIQUE  
  • FOREIGN KEY المفتاح الاجنبي وهو يعرف بشكل فريد الاسطر ولكن في جدول ثاني غير الجدول الحالي اي هو عبارة عن حقل PRIMARY KEY  المفتاح الاساسي في جدول اخر.
  • CHECK يضمن ان جميع القيم للحقل تتبع قاعدة معينة مثلا قاعدة حقل العمر التي شرحناها اعلاه
  • DEFAULT يضمن اعطاء قيمة افتراضية للحقل في حالة عدم تحديد قيم لهذا الحقل. 
  • INDEX وهو محدد مهم جدا يساعد في تحسين سرعة وكفاءة التطبيق عن طريق فهرسة البيانات مما يسرع عمليات استعادة البيانات. 

الدرس الثامن تعديل الجداول ALTER TABLE

لتعديل الجداول في قاعدة البيانات بأستخدام لغة SQL سوف نستخدم الايعاز ALTER TABLE  وهو من ايعازات Data Definition Language او ما يعرف اختصارا ب DDL
 
   ALTER TABLE table_name 
وهناك عدة استخدامات لهذا الايعاز مثلا يمكن استخدام لاضافة عمود جديد او لحذف عمود من الجدول او لتغيير عمود موجود مثلا نغيير نوع البيانات او طول البيانات وكذلك يمكن استخدامه لحذف المحددات (Constraints). 
ملاحظة
  • يجب ان نكون حذرين جدا عند تعديل الجداول باستخدام ايعاز  ALTER TABLE لان هذا الايعاز سوف يغير تركيب الجدول وفي بعض الاحيان سوف يغير نوع البيانات الخاصة بالاعمدة وهذا قد يؤثر على البيانات المخزنة حالية في  الجدول. لذلك يجب اخذ الاحتياطات اللازمة مثلا اذا كان الجدول يحتوي على معلومات حساسة قد تحتاج اليها لاحقا يمكن حفظ نسخة من هذا الجدول ولكن بأسم ثاني بأستخدام عبارة SELECT  INTO  (كماشرحنا ذلك في الدرس السابق) او الاحتفاظ بنسخة من ملفلت النسخ الاحتياطي لقاعدة البيانات (Backup Files) وبتالي نستطيع استرجاع المعلومات من النسخ الاحتياطي.

الايعاز ALTER TABLE - ADD Column
يستخدم هذا الايعاز لاضافة حقول جديدة الى جدول موجود مسبقا. كما ذكرنا في المواضيع السابقة يجب الاهتمام بعملية تصميم الجداول حتى لانضطر الى تغيير جدول بعد ادخال البيانات ولكن في بعض الحالات سوف نضطر الى تغيير الجدول عندما تتغير المتطلبات. مثلا جدول الزبائن الذي كوناه في الدروس السابقة يمكن نضيف اليه حقلين جديدين حقل البلد وحقل المدينة يمكن تنفيذ الايعاز التالي
 
 ALTER TABLE CUSTOMER ADD CUTSOMER_CITY VARCHAR (100), CUTSOMER_COUNTRY VARCHAR (100) 

  او يمكن تنفيذ الايعاز مرتين بشكل منفصل
 
 ALTER TABLE CUSTOMER ADD CUTSOMER_CITY VARCHAR (100)
ALTER TABLE CUSTOMER ADD CUTSOMER_COUNTRY VARCHAR (100) 

في كلا الحالتين سوف يقوم نظام أدارة قواعد البيانات SQL Server بأضافة الحقلين في نهاية الجدول اي موقع الحقلين سوف يكون في نهاية الجدول بعد اخر حقل كان موجود مسبقا. واذا كان الجدول يحتوي على اسطر فان النظام سوف يستخدم NULL كقيمة لهذين الحقلين ولكل الاسطر.

الايعاز ALTER TABLE - DROP COLUMN
اذا انتفت الحاجة لأحد حقول الجدول واردنا ازالته من الجدول يمكن استخدام الايعاز التالي ,لكن تذكر ان تأخذ الاحتياطات اللازمة لانه بعد تنفيذ هذا الايعاز سوف يقوم SQL Server بأزالة هذا الحقل والبيانات المخزنة فيه لذا يجب اخذ النسخ الاحتياطي اما للجدول بشكل منفصل او لكامل قاعدة البيانات. في المثال التالي سوف نحذف حقل المدينة: 
 
 ALTER TABLE CUSTOMER DROP COLUMN CUTSOMER_CITY
 

الايعاز ALTER TABLE - ALTER COLUMN
اذا اردنا تغيير نوع البيانات في احد الحقول او تعديل نوع البيانات يمكن استخدام الايعاز  ALTER TABLE - ALTER COLUMN وهنا ايضا يجب ان نكون حذرين لان تغيير نوع البيانات سوف يكون له الاثر الكبير على البيانات الموجودة في الجدول مسبقا لذا يجب التخطيط لذلك مسبقا واخذ اخذ النسخ الاحتياطي اما للجدول بشكل منفصل او لكامل قاعدة البيانات. في هذا المثال سوف نعمل على زيادة طول حقل المدينة (CUSTOMER CITY) من VARCHAR 100  الى VARCHAR 200 
 
 ALTER TABLE CUSTOMER ALTER COLUMN CUTSOMER_CITY VARCHAR (200)
 

الدرس السابع حذف الجداول باستخدام DROP TABLE

لحدف الجداول من قاعدة البيانات بأستخدام لغة SQL سوف نستخدم الايعاز DROP TABLE  وهو من ايعازات Data Definition Language او ما يعرف اختصارا ب DDL
 
 DROP TABLE table_name 
مثلا لحذف جدول الزبائن CUSTOMER يمكن كتابة وتنفيذ الايعاز التالي في SQL Server Management Studio
 
 DROP TABLE CUSTOMER 
ملاحظة
  • يجب ان نكون حذرين جدا عند حذف الجداول لان ايعاز  DROP TABLE سوف يحذف الجدول وكل البيانات المخزنة في هذا الجدول. لذلك يجب اخذ الاحتياطات اللازمة مثلا اذا كان الجدول يحتوي على معلومات حساسة قد تحتاج اليها لاحقا يمكن حفظ نسخة من هذا الجدول ولكن بأسم ثاني بأستخدام عبارة SELECT  INTO او الاحتفاظ بنسخة من ملفلت النسخ الاحتياطي لقاعدة البيانات (Backup Files) وبتالي نستطيع استرجاع المعلومات من النسخ الاحتياطي.
  • لتنفيذ هذا الايعاز يجب ان تمتك الصلاحيات الامنية المناسبة يجب ان يكون المستخدم عضو في الدور الامني المسمى db_owner role.

النسخ الاحتياطي للجدول ضمن قاعدة البيانات
لاخذ النسخ الاحتياطي للجدول قبل القيام بحذفه يمكن تنفيذ الايعاز SELECT INTO كما يلي 
 
 SELECT * INTO CUSTOMER_BK_01DEC2017 FROM CUSTOMER
سوف يقوم الايعاز اعلاه بتكوين جدول جديد (CUSTOMER_BK_01DEC2017) يماثل بمواصفاته (من حيث عدد الاعمدة ونوع البيانات لكل عمود)الجدول (CUSTOMER) وكذلك ينسخ كل البيانات من الجدول (CUSTOMER) ويخزنها في الجدول الجديد (CUSTOMER_BK_01DEC2017).أن تنفيذ هذا الايعاز سوف يكون الجدول الجديد بنفس قاعدة البيانات الحالية.
اذا اردنا ان نأخذ النسخ الاحتياطي في قاعدة بيانات اخرى (مثلا قاعدة بيانات مخصصة للنسخ الاحتياطي اسمها مثلا BACKUP) يمكن تنفيذ الايعاز التالي 
 
SELECT * INTO BACKUPDB.dbo.CUSTOMER_BK_01DEC2017 FROM CUSTOMER

في هذا الايعاز استخدمنا ما يعرف بالاسم الكامل للجدول الجديد الذي نريد ان نستخدمه كجدول احتياطي والاسم الكامل(BACKUPDB.dbo.CUSTOMER_BK_01DEC2017) مكون في هذه الحالة من ثلاثة اجزاء الجزء الاول يمثل اسم قاعد البيانات(BACKUPDB) الذي نريد تكوين الجدول فيها. والجزء الثاني يمثل مايعرف ب Schema او مالك هذ الكائن وهو في هذه (dbo) وهو الاسم الافتراضي لمالك قاعدة البيانات Database Owner والجز الاخير اسم الجدول الجديد (جدول النسخ الاحتياطي) (CUSTOMER_BK_01DEC2017).
للتحقق من ان عملية النسخ الاحتياطي تمت بنجاح نستطيع تنفيذ الايعاز التالي لمقارنة عدد السجلات في كلا الجدولين :
 
SELECT COUNT(*)  FROM CUSTOMER
SELECT COUNT(*)FROM BACKUPDB.dbo.CUSTOMER_BK_01DEC2017 
 
للتحقق من ان عملية النسخ الاحتياطي تمت بنجاح نستطيع تنفيذ الايعاز التالي لمقارنة اول الف سجل من كلا الجدولين عن طريق التحقق من البيانات بصريا  وبعد التأكد من ان الجدولين متطابقين يمكن تنفيذ ايعاز DROP TABLE
 
SELECT TOP 1000 *  FROM CUSTOMER
SELECT TOP 1000 *  FROM BACKUPDB.dbo.CUSTOMER_BK_01DEC2017 

الدرس السادس تكوين الجداول في قاعدة البيانات CREATE TABLE

لتكوين الجداول في  قاعدة البيانات بأستخدام لغة SQL سوف نستخدم الايعاز CREATE TABLE  وهو من ايعازات Data Definition Language او ما يعرف اختصارا ب DDL
 
 CREATE TABLE table_name (
    column1 datatype,
    column2 datatype,
    column3 datatype,
   ....
);
مثلا لتكوين جدول الزبائن CUSTOMER يمكن كتابة وتنفيذ الايعاز التالي في SQL Server Management Studio
 
 CREATE TABLE CUSTOMER 
(
CUTSOMER_ID VARCHAR (10),
CUTSOMER_NAME VARCHAR (200),
CUTSOMER_AGE INT,
CUTSOMER_ADDRESS VARCHAR (3000)
); 
ملاحظة لنفيذ هذا الايعاز يجب ام تمتك الصلاحيات الامنية المناسبة يجب ان يكون المستخدم عضو في الدور الامني المسمى db_owner role.
ايعاز تكوين الجداول مقسم الى جزئين . الجزء الاول يتكون من عبارة CREATE TABLE متبوعة بأسم الجدول الذي نريد تكوينه. 
الجزء الثاني سوف يحتوي على قائمة بألاعمدة  التي يحتويها الجدول وتكون موضوعة بين القوسين ( ) ويفصل بين العمود والاخر بالفارزة ( , )COMMA.
وعند تعريف العمود نحتاج الى شيئين رئيسسين الاول هو اسم العمود مثلا (CUSTOMER_ID) متبوع بنوع البيانات (Data Type) الذي سوف يحتويها هذا العمود.
 مثلا عمود CUSTOMER_ID سوف يكون من نوع (VARCHAR (10 وذلك لان حقل معرف الزبون (CUSTOMER_ID) سوف يحتوي على قيم نصية. الرقم 10 ضمن نوع البيانات (VARCHAR (10 يعني ان الطول الاقصى الذي يمكن ان نخزنه بهذا الحقل يجب ان يتكون من عشر حروف فأذا حاولنا ان نخزن نص اطول من العشرة سوف نحصل على رسالة الخطأ التالية من SQL Server والتي تعني ان النص الذي نحاول تخزينه في حقل معرف الزبون يتعدى الطول المسموح.
 

Msg 8152, Level 16, State 14, Line 1
String or binary data would be truncated.
The statement has been terminated.

لذلك من المنهم جدا تحديد انواع البيانات والطول المطلوب لكل حقل بشكل دقيق قبل تكوين الجداول وذلك لتجنب المشاكل التي تنتج عن عدم اختيار نوع البيانات المناسب. ولكن توجد هناك طرق لتعديل الجداول بعد تكوينها وحتى اذا كانت تحتوي على بيانات سوف نتطرق لها في موضوع منفصل في هذا الفصل.
الحقل الثاني وهو اسم الزيون تم تعريفه كحقل نصي ايضا ولكن بطول اكبر و هو 200 وبتالي نستطيع تخزين الاسماء الطويلة و الحقل الثالث هو عمر الزبون(CUTOMER_AGE) هنا استخدمنا نوع بيانات جديد (INT) وهو يمثل الارقام الصحيحة واخترنا هذا النوع لانه يتناسب مع نوع البيانات التي نريد تخزينها في هذا العمود كرقم صحيح (مثلا عمر الزبون يكون 22 او 43 الخ ...). اخيرا الحقل الاخير هو عنوان الزبون وهو حقل نصي ايضا ولكن بطول يناسب معلومات العنوان لذا اخترنا الطول 3000.

الأحد، 24 ديسمبر 2017

الدرس الخامس : حدف قاعدة البيانات DROP DATABASE

لحذف قاعدة البيانات بأستخدام لغة SQL سوف نستخدم الايعاز DROP وهو من ايعازات Data Definition Language او ما يعرف اختصارا ب DDL
 DROP DATABASE databasename






مثلا لحف قاعدة بيانات اسمها TEST يمكن كتابة وتنفيذ الايعاز التالي في SQL Server Management Studio

 DROP DATABASE TEST



    

ملاحظة لنفيذ هذا الايعاز يجب ام تمتك الصلاحيات الامنية المناسبة يجب ان يكون المستخدم عضو في الدور الامني المسمى db_owner role.

يجب ان نكون حذرين جدا عند تنفيذ هذا الايعاز (DROP DATABASE) سوف يؤدي الى حذف قاعدة البيانات من نظام ادارة قواعد البيانات (SQL Server) وكذلك يؤدي الى حذف ملفات MDF و LDF من System file وبتالي لايمكن استرجاع قاعدة البيانات ما لم نمتلك ملفات النسخ الاحتياطي (Backup Files) لذلك يجب ان لا ننفذ هذا الايعاز مالم نتأكد من وجود ملفات النسخ الاحتياطي وكذلك يجب التأكد من صلاحية ملفات النسخ الاحتياطي عن طريق القيام بعملية (Restore) لهذه الملفات والتأكد من صلاحيتها. 
هناك حالة خاصة وهي اذا كانت قاعدة البيانات ضمن الحالة (offline) فأن تنفيذ  (DROP DATABASE) سوف يؤدي فقط الى حذف قاعدة البيانات من نظام ادارة قواعد البيانات (SQL Server) بينما تبقى ملفات MDF و LDF موجودة في System file لذلك في هذه الحالة يجب ان نقوم يدويا بأزلة هذه الملفات من System File.
اذا اردنا ازالة قاعدة بيانات من SQL Server بشكل مؤقت فهناك طرقة اكثر امانا وهي استخدام عملية (Detaches) اي فصل قاعدة البيانات حيث ان هذه العملية تؤدي فقط الى حذف قاعدة البيانات من نظام ادارة قواعد البيانات (SQL Server) ولكن تبقي ملفات ملفات MDF و LDF موجودة في System file وبتالي يمكن اضافة قاعدة البيانات مرة اخرى وبسهولة الى نظام ادارة قواعد البيانات (SQL Server). هناك بعض المتطلبات الخاصة بعملية (Detach) حيث يجب ان تكون قاعدة البيانات ضمن الحالة (SINGLE_USER) وهذا سوف يضمن عدم اتصال المستخدمين بقاعدة البيانات ويوفر ما يسمى بالوصول الحصري (exclusive access) والذي يمكننا من القيام بعملية الفصل  (Detach)  بشكل امن. ان الوصول الحصري (اي وضع قاعدة البيانات ضمن الحالة (SINGLE_USER)) سوف يؤدي الى قطع كل الاتصالات الموجودة (drop connections) بين المستخدمين الاخرين وقاعدة البيانات وهذا يضمن عدم حدوث اي عمليات تعيق عملية فصل قاعدة البيانات. 
لتحويل قاعدة البيانات الى الحالة (SINGLE_USER) الايعازات التالية:
USE master;
ALTER DATABASE TEST
SET SINGLE_USER;
GO  





بعد تنفيذ الايعازات السابقة يمكن المباشرة بعملية فصل قاعدة البيانات عن طريق تنفيذ الاجراء المخزن (Stored Procedure) التالي :
USE master; 
EXEC sp_detach_db 'TEST', 'true';





كذلك يمكن القيام بعملية فصل قاعدة البيانات عن طريق استخدام SQL Server Management Studio كما موضح في الصور التالية: نضغط بزر الفارة الايمن على اسم قاعدة البيانات ثم نختار Task ومنها نتختار Detach 
فيظهر مربع الحوار Detach Database ونختار الخيار Drop Connections ثم نغط على الزر OK.





الجمعة، 22 ديسمبر 2017

الدرس الرابع تكوين قاعدة البيانات بأستخدام الايعاز CREATE DATABASE

لتكون قاعدة البيانات بأستخدام لغة SQL سوف نستخدم الايعاز CREATE  وهو من ايعازات Data Definition Language او ما يعرف اختصارا ب DDL
 CREATE DATABASE databasename





مثلا لتكوين قاعدة بيانات اسمها TEST يمكن كتابة وتنفيذ الايعاز التالي في SQL Server Management Studio

 CREATE DATABASE TEST



   


 ملاحظة لنفيذ هذا الايعاز يجب ام تمتك الصلاحيات الامنية المناسبة يجب ان يكون المستخدم عضو في الدور الامني المسمى db_owner role.

ان ايعاز تكوين قاعدة البيانات يمتلك العديد من التفاصيل الاخرى في المثال السابق نفذنا الايعاز الاساسي الذي فقط يحتاج الى اسم قاعدة البيانات. في المثال التالي نفذنا نفس الايعاز مع استخدام التفاصيل الاخرى مثل اسم ومكان ملفات LDF و MDF وكذلك حجم ملفات  LDF و MDF و الحجم الاقصى لملف قاعدة البيانات (UNLIMITED) وهذه يعني اننا نسمح لقاعدة البيانات بزيادة الحجم بدون حدود طالما ان هناك مساحة فارغة في harddisk  وكذلك حددنا حجم الزيادة في ملفات MDF و LDF. مثلا (FILEGROWTH = 1024KB) لملف MDF تعني ان نظام ادارة قواعد البيانات سوف يزيد حجم قاعدة البيانات بمقدار(1024KB) عند امتلاء قاعدة البيانات اي عندما يصل حجم ملف MDF الى 4288KB (وهو الحجم الابتدائي لملف MDF الذي استخدمناه في الايعاز. بلنسبة لملف LDF استخدمنا الحجم الابتدائي 1072KB وحددنا حجم الزيادة بأستخدام نسبة مؤية( FILEGROWTH = 10%) اي سوف يقوم نظام ادارة قواعد البيانات بزيادة حجم ملف بمقدار 107KB عند امتلاء ملف LDF. 
ملاحظة: ملف MDF هو الملف الاساسي الذي يستخدم لخزن البيانات ومعلومات قاعدة البيانات الاخرى التي يستخدمها نظام ادارة قواعد البيانات اما ملف LDF فيستخدم لتتبع التغييرات التي تطرء على قاعدة البيانات (اي تتبع التغيرات في ملف MDF) جراء عمليات INSERT , UPDATE , DELETE  وغيرها من العمليات الاخرى. نظام ادارة قواعد البيانات يستخدم كلا الملفين MDF و LDF لادارة قاعدة البيانات و العمليات المرتبطة بها.

USE [master]
GO
CREATE DATABASE [TEST]
 CONTAINMENT = NONE
 ON  PRIMARY
( NAME = N'TEST', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQL4ARABS\MSSQL\DATA\TEST.mdf' , SIZE = 4288KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
 LOG ON
( NAME = N'TEST_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQL4ARABS\MSSQL\DATA\TEST_log.ldf' , SIZE = 1072KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO













الأربعاء، 20 ديسمبر 2017

الدرس الثالث :لغة الاستعلام الهيكلية Structured Query Language(SQL)

لغة الاستعلام الهيكلية (Structured Query Language(SQL وهي اللغة البرمجية التي تمكننا من تخزين و معالجة واسترجاع البيانات ضمن انظمة إدارة قواعد البيانات العلائقية وكذلك تمتلك لغة SQL القابلية على تكوين قواعد البيانات والجداول والمشاهد والاجراءات المخزنة وغيره من كائنات قواعد البيانات.

ما الذي تستطيع فعله بأستخدام لغة SQL ؟

  • يمكن ان تنفذ استعلامات على قواعد البيانات لاسترجاع البيانات وعرضها ضمن التطبيقات المختلفة.
  • يمكن تنفيذ استعلامات لتخزين البيانات في قواعد البيانات عن طريق الايعاز INSERT.
  • يمكن تنفيذ استعلامات لتحديث سجل او سطر معين او مجموعة من الاسطرعن طريق الايعاز UPDATE.






  • يمكن تنفيذ استعلامات حذف سجل او سطر معين او مجموعة من الاسطرعن طريق الايعاز DELETE.
  • يمكن تنفيذ استعلام لتكوين قاعدة بيانات جديدة او لحذف قاعدة بيانات موجودة.
  • يمكن تنفيذ استعلام لتكوين جدول جديد او تعديل جدول موجود او حذف جدول موجود.
  • يمكن تنفذ استعلام لتكوين اجراء مخزن او تعديل  اجراء مخزن او حذف  اجراء مخزنموجود.
  • يمكن تنفذ استعلام لتكوين مشاهد او تعديل مشهد او حذف مشهد موجود.
  • يمكن تنفيذ استعلام لاعطاء الصلاحيات للمستخدمين لتنفيذ الاجراءات على الجداول او تعديل الكائنات الاخرى مثل الاجراءات المخزنة او المشاهد.


  • انواع ايعازات SQL 
    تنقسم ايعازات SQL الى ثلاثة انواع رئيسية :

    • ايعازات لغة تعريف البيانات (Data Definition Language (DDL
    وتمتلك هذه المجموعة ثلاثة ايعازات رئيسية هي CREATE , ALTER , DROP ومن اسم هذه المجموعة نستنتج ان هذه الايعازات في العادة تستخدم لتعريف البيانات او تستخدم لتكوين وتعديل وازالة قواعد البيانات وكائنات قواعد البيانات المختلفة مثلا الايعاز CREATE يمكن ان يستخدم لتكوين قاعدة بيانات وكذلك يمكن ان يستخدم لتكوين جدول او مشهد View او اجراء مخزن Stored Procedure او دالة SQL Function وغيره من الكائنات الاخرى فيما يلي وصف عام لايعازات هذه المجموعة وسوف نتعرف في الدروس اللاحقة عن تفاصيل استخدام هذه الايعازات.


    تتعريف الايعاز
    1
    CREATE
    Creates a new table, a view of a table, or other object in the database.
    2
    ALTER
    Modifies an existing database object, such as a table.
    3
    DROP
    Deletes an entire table, a view of a table or other objects in the database.
    • ايعازات لغة معالجة البيانات Data Manipulation Language DML
    وتمتلك هذه المجموعة اربعة ايعازات رئيسية وهي تمثل المحور الاساسي في برمجة قواعد البيانات حيث تشمل هذه المجموعة الايعازات التي سوف تستخدم في خزن البيانات عن طريق الايعاز INSERT وتعديل البيانات المخزنة عن طريق الايعاز UPDATE وحذف البيانات عن طريق الايعاز DELETE واخيرا استرجاع البيانات لغرض عرضها او معالجتها عن طريق الايعاز SELECT فيما يلي وصف عام لايعازات هذه المجموعة وسوف نتعرف في الدروس اللاحقة عن تفاصيل استخدام هذه الايعازات.

    تتعريف الايعاز
    1
    SELECT
    Retrieves certain records from one or more tables.
    2
    INSERT
    Creates a record.
    3
    UPDATE
    Modifies records.
    4
    DELETE
    Deletes records.


    • ايعازات لغة التحكم في البيانات Data Control Language DCL
    وهي تمثل المجموعة الاخيروتستخدم هذه الايعازات في التحكم بسماحيات الوصول الى البيانات وكائنات قواعد البيانات في العادة تستخدم هذه البيانات من قبل مدير قواعد البيانات Database Administrator ولا تستخدم من قبل مبرمج قواعد البيانات ولكن من الضروري ان يفهم المبرمج مدى تأثير هذه التطبيقات التي يطورها وكذلك تتعلق بمستوى الامان Security التي يوفرها للتطبيقات. مثلا الايعاز GRANT يمكن ان يستخدم لاعطاء صلاحية حذف البيانات من جدول معين لمستخدم معين وبتالي فان مستخدم واحد فقط يمتلك صلاحية حذف البيانات من هذا الجدول فأذا حاول مستخدم اخر لايمتلك هذه الصلاحية القيام بعملية الحذف سوف يقوم SQL Server بأرسال رسالة خطاء ويمكن للمبرمج عرض هذه الرسالة من خلال التطبيق لاخبار المستخدم بانه لايمتلك صلاحية لحذف البيانات.  

    فيما يلي وصف عام لايعازات هذه المجموعة وسوف نتعرف في الدروس اللاحقة عن تفاصيل استخدام هذه الايعازات.

    تتعريف الايعاز
    1
    GRANT
    Gives a privilege to user.
    2
    REVOKE
    Takes back privileges granted from user.


    الدرس الثاني : الجداول Tables

    كما وضحنا في الدرس السابق ان انظمة إدارة قواعد البيانات العلائقية سوف تخزن البيانات في كائنات (Objects) تسمى الجداول (Tables) و الجداول هي عبارة عن مجموعة من الاعمدة (columns) والتي تمثل الوصف الكامل للوحدة Entity الذي يمثلها الجدول وأسطر (rows) والتي تمثل نسخة Instance من نوع هذه الوحدة Entity.
    مثلا جدول الزبائن (Customer) سوف يحتوي على الاعمدة التالية:
    1. ID:هذا العمود سوف يمتلك قيمة فريدة لكل سطر وهو يمثل معرف الزبون
    2. NAME:هذا العمود سوف يمثل اسم الزبون
    3. AGE:هذا العمود سوف يمثل عمر الزبون
    4. ADDRESS:هذا العمود سوف يمثل عنوان الزبون
    كما لاحظنا اعلاه ان لكل عمود وظيفة محددة ويستخدم لتخزين نوع محدد من البيانات وهذه الاعمدة مجتمعة سوف تمثل الوصف الكامل للوحدة Entity وفي هذه الحالة ان الوحدة هي الزبون ولكل زبون سوف يكون هناك معرف فريد (ID) واسم وعمر وعنوان.

    اما الاسطر فهي تمثل البيانات الفعلية التي يتم تخزينها في الجدول وكل سطر سوف يمتلك نفس العدد من الحقول (columns) والسطر سوف يمثل نسخة Instance من نوع هذه الوحدة Entity مثلا جدول الزبائن التالي يمتلك خمس اسطر اي خمس نسخ من وحدة الزبائن.


    حقل المعرف ID يمتلك قيمة فريدة وبتالي نستطيع الوصول الى اي سطر في هذا الجدول مثلا اذا كتبنا عبارة 
    select * from CUSTOMERS where ID ='ID003' 
    فان النظام سوف يعيد السطر الثالث وهو الزبون محمد علي احمد وعمره 42 وعنوانه العراق بغداد.




    الدرس الاول -نظام إدارة قواعد البيانات العلائقية (Relational database management system (RDBMS

    نظام إدارة قواعد البيانات العلائقية والذي يعرف اختصار ب(RDBMS) هو عبارة عن تطبيق او برنامج يستخدم لادارة قواعد البيانات العلائقية (RDB). قواعد البيانات العلائقية تخزن البيانات في كائنات خاصة تسمى الجداول (Tables) وهي تعتمد النموذج العلائقي (Relational model) في هذا النموذج يتم تخزين البيانات في جداول مكونة من اعمدة (columns) واسطر (rows) مع معرف فريد لكل سطر (Unique key). يستخدم هذا المعرف لتحديد سطر بيانات محدد لكي يسهل علينا لاحقا القيام بعمليات الاختيار (ٍSELECT) والتعديل (UPDATE) والحذف (DELETE).

    في العادة كل جدول سوف يمثل وحدة معينة (Entity) مثلا جدول الزبائن حيث ان كل سطر في هذا الجدول سوف يمثل زبون معين (وهو عبارة عن نسخة Instance من نوع هذه الوحدة Entity وهي الزبائن). مثل اخر جدول المنتجات حيث ان كل سطر سوف يمثل منتج معين (وهو عبارة عن نسخة Instance من نوع هذه الوحدة Entity وهي المنتجات).
     في النموذج العلائقي (Relational model) تنتظم العلاقات بين الجداول عن طريق ما يعرف ب (Relationships) وهو عبارة عن رابط منطقي بين الجداول المختلفة اعتمادا على التداخل الوظيفي بين هذه الجداول مثلا جدول الطلبيات (Order Table)سوف يمتلك علاقة منطقية بجدول الزبائن (Customer Table) وذلك لان كل طلبية (Order) يجب ان تكون متعلقة بزبون معين (وهو الشخص الذي طلب شراء المنتج المحدد) كذلك جدول المنتجات سوف يكون هناك رابط منطقي بينه وبين جدول الطلبيات لان كل طلبية يجب ان تحتوي على الاقل على منتج واحد.

    هناك العديد من انظمة إدارة قواعد البيانات العلائقية ومن اشهر هذه الانظمة Microsoft SQL Server , Oracle , IBM DB2 , MySQL , Microsoft Access
    الشي المهم الذي يجب ان نعرفه ببساطة هو ان انظمة إدارة قواعد البيانات العلائقية هي عبارة عن برامج او تطبيقات حالها كحال التطبيقات الاخرى ولكن لها وظائفيات خاصة تتعلق بأدارة قواعد البيانات العلائقية. في المقابل هناك تطبيقات تستخدم قواعد البيانات العلائقية لخزن ومعالجة البيانات  مثلا انظمة ادارة الموارد ERP اومواقع الويب او تطبيقات الهواتف الذكية  وهذه التطبيقات سوف تتوصل مع انظمة إدارة قواعد البيانات العلائقية (وهي ايضا عبارة عن تطبيقات) لغرض خزن ومعالجة واسترجاع البيانات.

    استيراد البيانات بأستخدام SQL Import options

    الطريقة الاخرى لادخال البيانات الى جداول النظام هي عن طريق استيراد البيانات بأستخدام وظائفية SQL Import. حيث يمتلك SQL Server مجموعة واسعة من خيارات استيراد البيانات مثلا يمكن استيراد البيانات من ملفات Flat Files مثل ملفات بأمتداد (TXT or CSV) كذلك يمكن استيراد البيانات من ملفات الاكسل و ملفات الاكسس كذلك يمكن استيراد البيانات من قاعدة بيانات اخرى تقع في نفس SQL Server او من قاعدة بيانات تقع في SQL Server بعيد. وهناك العديد من الخيارت الاخرى.
    هناك خيارات متقدمة اخرى عن طريق استخدام خدمات تكامل البيانات الخاصة ب SQL Server او مايعرف اختصارا ب SSIS (SQL Server Integrated Services). وسوف نحاول ان نشرح هذه الطرق في مدونة خاصة بهذا الموضوع لانه نوعا ما غير متصل ببرمجة قواعد البياناتز
     كل من هذه الخيارات يحتاج الى نوع معين من الاعدادت والخطوات. اسهل هذه الخيارات هو استيراد البيانات من ملفات الاكسل والسبب في ذلك هو ان SQL Server سوف يقوم بشكل ذاتي بكل عمليات تحويل البيانات (convert data types) وكل ما نحتاج للقيام به هو فقط تحديد ملف الاكسل الذي نريد استخدامه لاستيراد البيانات والجدول الذي نريد ادخال البيانات اليه الفديو التالي يشرح كيفية القيام بذلك لتحديث جداول الاقسام والفروع.




    استخدام ملفات الاكسل لكتابة SQL Code لادخال البيانات الى جداول النظام -Use Excel File to create SQL Insert code to insert data in system table

    في العادة ان ادخال البيانات الى جداول النظام يتم عن طريق نوافذ مخصصة لهذا الغرض او صفحات ويب مخصصة لهذا الغرض اعتمادا على نوع التطبيق. في بعض التطبيقات المتقدمة مثل انظمة ERP تمتلك وظائفيات اضافية لقراءة البيانات من ملفات CSV , Excel ثم يتم ادخال المعلومات الى الجداول في قاعدة البيانات. 

    هناك طرق اخرى للقيام بهذه العمليات حتى اذا لم تكن النوافذ متوفرة (مثلا لايزال التطبيق في مرحلة التطوير). مثلا في تطبيق المبيعات لدينا قائمة بالاقسام و الفروع التي نريد ادخالها الى جداول الاقسام والفروع وبدلا من كتابة عبارة SQL Insert بشكل يدوي يمكن القيام بذلك بشكل اتوماتيكي عن طريق استخدام ملف الاكسل الذي سوف يساعدنا في كتابة SQL Code وفقط نحتاج الى نسخ الكود من ملف الاكسل وتنفيذها.
    الفديو التالي يشرح كيفية القيام بذلك 

    الأحد، 10 ديسمبر 2017

    برنامج المبيعات الدرس الثامن: استخدام ملف الاكسل لادخال البيانات الى جداو...

    برنامج المبيعات الدرس السابع : استخدام الاكسل لكتابةSQL Code لادخال البيا...

    Table Design Departments and Sections4 Excel

    Table Design Departments and Sections3 4

    الجمعة، 8 ديسمبر 2017

    Table Design Departments and Sections2

    Table Design Departments and Sections1

    Design System Setup Module2

    Design System Setup Module

    برمجة قواعد البيانات Microsoft SQL Server من المبادىء الاساسية الى ال...

    FOREIGN KEY المفتاح الاجنبي

    المفتاح الاجنبي : هو عبارة عن حقل مفتاح اساسي في الجدول الاول ونفس هذا الحقل يكون موجود في الجدول الثاني ويستخدم هذا الحقل لتعريف علاقة بين الجدول الاول والجدول الثاني.
    FOREIGN KEY:  a primary key field of first table and this field added to the second table , this field will be used to define the relation between table 1 and table 2.

    في المثال التالي الحقلين (DEPTID, SECTIONID) هما عبارة عن مفاتيح اجنبية (FOREIGN KEY) وذلك لان هذه الحقول هي عبارة عن حقول (Primary Key) في الجدولين(SYS_SALS_DEPARTMENT) و (SYS_SALS_SECTIONS) وهذا هو التعريف العملي لمبدىْ المفتاح الاجنبي وهو يستخدم لبناء العلاقات بين الجداول المختلفة.

    PRIMARY KEY المفتاح الاساسي

     المفتاح الاساسي  يكون على شكل قيد وهو يكون معرف وحيد لسطر البيانات اي القيمة لاتتكر في اكثر من سطر. ومن خصائصه الاخرى يجب ان يحتوي هذا الحقل على قيمة وبتالي لايمكن ان يمتلك (Null Values).كل جدول يمكن ان يمتلك مفتاح اساسي واحد فقط. 

    The PRIMARY KEY constraint uniquely identifies each record in a database table.
    Primary keys must contain UNIQUE values, and cannot contain NULL values.
    A table can have only one primary key

    تصميم جداول الاقسام والفروع Table Design Departments and Sections

    سوف نصمم ثلاثة جداول وكما يلي :

    • جدول الاقسام (Departments Table): هذا الجدول سوف يستخدم لحفظ معلومات الاقسام مثلا قسم المبيعات و قسم المالية ...الخ.
      1. يمتلك هذا الجدول حقل معرف القسم DEPTID وهو من نوع (25)VARCHAR وهو سوف يكون المفتاح الاساسي (Primary Key) لهذا الجدول. مثلا قسم المبيعات سوف يمكون معرفه SALES. 
      2. الحقل الثاني هو الوصف (Description) مثلا قسم المبيعات سوف يمتلك القيمة (Sales) في هذا الحقل.
      3. الحقول (25)CREATEDBY VARCHAR و CREATEDDATE DATETIME) سوف تستخدم لتخزين معرف المستخدم (User ID) الذي قام بأضافة البيانات وتاريخ اضافة البيانات. وهذه ميزة جيدة في التصميم تساعدنا لاحقا في متابعة التغييرات في التطبيق. مثلا اذا قام مستخدم بأضافة قسم جديد بدون الحصول على الموافقة المطلوبة سوف يساعدنا هذا الحقل في التعرف على المستخدم وبتالي يمكن سؤال المستخدم عن سبب اضافة القسم الجديد.
      4.  الحقول MODIFIEDBY و MODIFIEDDATE سوف تستخدم لتخزين معرف المستخدم (User ID) الذي قام بتعديل البيانات وتاريخ تعديل البيانات. وهذه ميزة جيدة في التصميم تساعدنا لاحقا في متابعة التغييرات في التطبيق. مثلا اذا قام مستخدم بتعديل وصف لقسم موجود سوف يساعدنا هذا الحقل في التعرف على المستخدم وبتالي يمكن سؤال المستخدم عن سبب تعديل وصف القسم. 
    الصورة التالية توضح نموذج عن البيانات التي يتم تخزينها في هذا الجدول






    فيما يلي الشفرة البرمجية لتكوين هذا الجدول :





    CREATE TABLE [WORK].[dbo].[SYS_SALS_DEPARTMENT] 

    (

        DEPTID VARCHAR (25) NOT NULL,

        [DESCRIPTION] VARCHAR (250) NOT NULL,

        CREATEDBY VARCHAR (25) NOT NULL,

        CREATEDDATE DATETIME NOT NULL,

        MODIFIEDBY VARCHAR (25) NULL,

        MODIFIEDDATE DATETIME

       PRIMARY KEY (DEPTID),

        ID INT identity (1,1)

    )

    اسم الجدول SYS_SALS_DEPARTMENT وهو مقسم على اجزاء كما يلي:
    • البادئة (ٍSYS) وهي تعني ان هذا الجدول هو من جداول أعدادت النظام.
    • البادئة (SALS)  وهي تعني ان هذا الجدول متعلق بوظائفية المبيعات.
    • واخيرا اسم الجدول (DEPARTMENT) .

    ملاحظة : اصطلاح التسمية(naming convention) جزء مهم جدا من تصميم قواعد البيانات وخصوصا اذا كان التطبيق سوف يحتوي العشرات من الجداول فمن المهم جدا ان نتبع قواعد اصطلاح التسمية(naming convention) حتى يسهل علينا التعرف على وضيفة الجدول من مجرد النظر الى اسمه.


     (DEPTID)  في الحقل NOT NULL استخدمنا الخاصية
    --  وذلك لكي نخبر النظام ان هذا الحقل يجب ان يحتوي على قيمةفأذا حاول المستخدم   
    --اضافة سطر بدون اعطاء قيمة لذه الحقل سوف يحصل على رسالة خطاء من نظام قواعد البيانات وهذا من متطلبات الحقل 
    .الاساسي


    كذلك استخدمنا الخاصية (NOT NULL)مع حقل الوصف وهذا من متطلبات وظائف التطبيق يجب ان يكون لكل قسم وصف معين.


    كذلك استخدمنا الخاصية (NOT NULL)مع حقل CREATEDBY  و CREATEDDATE  وهذا من متطلبات وظائف التطبيق حتى نتمكن من متابعة التغيرات. بينما في حقل MODIFIEDBY  و MODIFIEDDATE  لم نستخدم هذه الخاصية لانه ليس من الضروري ان يتم تعديل هذا السطر. 


    • جدول الفروع(Sections Table): هذا الجدول سوف يستخدم لحفظ معلومات الفروع مثلا فرع مبيعات  المنطقة الشمالية و فرع مبيعات  المنطقة الجنوبية...الخ.
      1. يمتلك هذا الجدول حقل معرف القسم SECTIONID وهو من نوع (25)VARCHAR وهو سوف يكون المفتاح الاساسي (Primary Key) لهذا الجدول. مثلا فرع المبيعات الشمالي  سوف يمكون معرفه NSALES. 
      2. الحقل الثاني هو الوصف (Description) مثلا قسم المبيعات سوف يمتلك القيمة (Sales) في هذا الحقل.
      3. الحقول (25)CREATEDBY VARCHAR و CREATEDDATE DATETIME) سوف تستخدم لتخزين معرف المستخدم (User ID) الذي قام بأضافة البيانات وتاريخ اضافة البيانات. وهذه ميزة جيدة في التصميم تساعدنا لاحقا في متابعة التغييرات في التطبيق. مثلا اذا قام مستخدم بأضافة قسم جديد بدون الحصول على الموافقة المطلوبة سوف يساعدنا هذا الحقل في التعرف على المستخدم وبتالي يمكن سؤال المستخدم عن سبب اضافة القسم الجديد.
      4.  الحقول MODIFIEDBY و MODIFIEDDATE سوف تستخدم لتخزين معرف المستخدم (User ID) الذي قام بتعديل البيانات وتاريخ تعديل البيانات. وهذه ميزة جيدة في التصميم تساعدنا لاحقا في متابعة التغييرات في التطبيق. مثلا اذا قام مستخدم بتعديل وصف لقسم موجود سوف يساعدنا هذا الحقل في التعرف على المستخدم وبتالي يمكن سؤال المستخدم عن سبب تعديل وصف القسم. 
    الصورة التالية توضح نموذج عن البيانات التي يتم تخزينها في هذا الجدول









    فيما يلي الشفرة البرمجية لتكوين هذا الجدول :


    CREATE TABLE [WORK].[dbo].[SYS_SALS_SECTIONS] 
    (
    SECTIONID VARCHAR (25) NOT NULL,
    [DESCRIPTION] VARCHAR (250) NOT NULL,
    CREATEDBY VARCHAR (25) NOT NULL,
    CREATEDDATE DATETIME NOT NULL,
    MODIFIEDBY  VARCHAR (25)  NULL,
    MODIFIEDDATE DATETIME

    PRIMARY KEY (SECTIONID),
    ID INT identity (1,1)
    )


    • الجدول الاخير في هذه المجموعة هو (Sections/Department Table): هذا الجدول مهم جدا وهو يمثل احدى مراحل تسوية قواعد البيانات (Database normalization)  . هذا الجدول سوف يعرف العلاقة بين الاقسام والفروع وبتالي سوف يمكن النظام من التعرف على الفروع الخاصة بكل قسم.  

      1. يمتلك هذا الجدول حقل معرف القسم DEPTID وهو من نوع (25)VARCHAR وهو سوف يكون جزء من المفتاح الاساسي (Primary Key) وبنفس الوقت يتعتبر هذا الحقل هو مقتاح اجنبي FOREIGN KEY
      2. الحقل الثاني هو حقل معرف القسم SECTIONID وهو من نوع (25)VARCHAR وهو سوف يكون وهو سوف يكون جزء من المفتاح الاساسي (Primary Key) وبنفس الوقت يتعتبر هذا الحقل هو مقتاح اجنبي FOREIGN KEY.
      3. الحقول CREATEDBY و CREATEDDATE و MODIFIEDBY و MODIFIEDDATE تم شرح الفائدة منها اعلاه.

    الصورة التالية توضح نموذج عن البيانات التي يتم تخزينها في هذا الجدول







    فيما يلي الشفرة البرمجية لتكوين هذا الجدول : 

    CREATE TABLE [WORK].[dbo].[SYS_SALS_DEPARTMENT_SECTIONS] 
    (
    DEPTID VARCHAR (25) NOT NULL,
    SECTIONID VARCHAR (25) NOT NULL,
    [DESCRIPTION] VARCHAR (250) NOT NULL,
    CREATEDBY VARCHAR (25) NOT NULL,
    CREATEDDATE DATETIME NOT NULL,
    MODIFIEDBY  VARCHAR (25)  NULL,
    MODIFIEDDATE DATETIME

    PRIMARY KEY (DEPTID, SECTIONID),
    ID INT identity (1,1)
    )

    كما نلاحظ في الشفرة اعلاه ان مفتاح الاساسي يحتوي على حقلين (PRIMARY KEY (DEPTID, SECTIONID)) وهذا ضرروي حتى نتمكن من انشاء علاقة صحيحة بين جدول الاقسام وجدول الفروع. هذا المفتاح الاساسي يضمن ان لايمكن تكرار العلاقة بين نفس القسم ونفس الفرع مثلا قسم المالية FINC والفرع الرئيسي FINHD يمتلكان فقط سطر واحد في هذا الجدول فأذا حاول التطبيق ان يقوم بأضافة سطر جديد بأستخدام نفس القيم قسم المالية FINC والفرع الرئيسي FINHD سوف يحصل على رسالة خطاء كما في الصورة ادناه.




    بنفس الوقت الحقلين (DEPTID, SECTIONID) هما عبارة عن مفاتيح اجنبية (FOREIGN KEY) وذلك لان هذه الحقول هي عبارة عن حقول (Primary Key) في الجدولين (SYS_SALS_DEPARTMENT) و (SYS_SALS_SECTIONS) وهذا هو التعريف العملي لمبدىْ المفتاح الاجنبي وهو يستخدم لبناء العلاقات بين الجداول المختلفة.

    الشكل التالي يوضح العلاقات بين الجداول الثلاثة