الانتقال إلى المحتوى

دورة متكاملة حول ادارة كائنات السكيما Managing Schema Objects


programmer_85

Recommended Posts

السلام عليكم  اخواني الكرام 

 

اولا عفوا ع انقطاعي ع المنتدى وذلك لكثرة عملي ودراستي .. ولذا لم اتمكن من المتابعة 

 

بمناسبة عودتي للمنتدى مرة ثانية ... 

 

حبيت ان اضع بين يديك شرح متوافي وكامل حووول موضوع ادارة الكائنات في السكيما او مايمسى

 

managing schema objects 

 

وقد اخترت الموضوع لاني رايته مهما جدا وكذا لايوجد عليه شرح متوافي وكامل ..

 

وفي شرحي لهذا الموضوع اعتمدت اولا ع الكتب المعتمدة من اوراكل والامثلة حول ذلك الموضوع 

 

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

 

ونخرج باستفادة واضحة من ذلك ...

 

فان شاء الله راح اطرح المنهج اي مايسمى syllables  حول ذلك في الرد الثاني ...

 

تقبلووووووا تحياتي لكم .. 

 

--------------------------------

تم تجميع دروس الدورة في ملف واحد بمعرفة الأخ / محمد طلعت ... في المشاركة رقم 19 من الموضوع

جزاه الله خيرا 

رابط هذا التعليق
شارك

المنهج الذي ان شاء الله سوف يتم تناول تدريسه في هذه الدوره :

 

1- اضافة وتعدبل الاعمدة ( add and modify columns)

 

2- حذف الاعمدة وكيفية اعداد الامر unused على الاعمدة 

 

3- اضافة القيود (add constraints)

 

4- انشاء الفهارس indexes باستخدام الامر alter table

 

5- كيفية انشاء دالة function مبنية على الفهارس indexes

 

6- كيفية العمل مع الامر flashback

 

7- كيفية انشاء واستخدام الجداول الخارجية 

 

 

ملاحظة :  كل نقطة تحوي ع عدة نقاط عديدة وهذا ماسوف نراه في بدياة الشرح ان شا ءالله 

 

تقبلووووا تحياتي 

 

 

رابط هذا التعليق
شارك

موضوع شيق يا مهندس 

ومن طوول الغيبااات جااااب الغنااائم .....

رابط هذا التعليق
شارك

الدرس الاول 

 

اضافة وتعديل الاعمدة (add & modify columns)

 

نسطيع ان نضيف او نعدل لبعض الاعمدة على الجدول الموجود في قواعد البيانات واذي قد تم تصميمه سابقا .

 

يمكن ان نتسخدم الامر alter table  لكي يقوم بتلك الوظيفة سواء كانت اضافة او تعديل او حتى حذف عمود او اكثر من الجدول الموجود .

 

الصيغة العامة للامر alter table هي :

 

ALTER TABLE table_name clause;

 

هنا table_name  هو اسم الجدول المراد العمل عليه وهو موجود في قواعد البيانات .

 

اما عن clause فهو يتمثل في modify ,add and drop لبعض الاعمدة .. سنرى ذلك من خلال الامثلة .

 

النقطة الاولى :  

 

كيفية اضافة الاعمدة ع الجدول 

 

قبل البدء فيها دعونا نقوم بانشاء جدول بسيط مكون من بعض الاعمدة وهو جدول orders  او الطلبات  باستخدام الامر create table 

create table orders (order_id number ,
sales_rep_id number);

الان نريد ان نضيف اعمدة اخرى ع الجدول الموجود في قواعد البيانات ..

 

فمن اجل ذلك وتسهيل الامر بدل من حذف الجدول نقوم باستخدام الامر ALTER TABLE  والذي يقوم بالاضافة للاعمدة المرغوب في اضافتها وكذا تعديل او حذف 

 

لدينا هذا العمود المسمى ORDER_DATE  سوف نقوم باضافته الى الجدول السابق  وذلك عن طريق الامر الاتي :

ALTER TABLE orders ADD ORDER_DATE DATE;

قمنا في المثال السابق باضافة العمود ORDER_DATE  الى الجدول السابق اضافة مع نوع البيانات له وهذا شي الزامي وهو من نوع Date 

 

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

ALTER TABLE orders ADD order_date date ,order_name varchar2(20);

يمكن ان نلخص من خلال المثاليين السابقين ماهو الاختياري وماهو الاجباري :

 

alter table  كلمة محجوزة وهي مطلوبة واجبارية في كتابتها .

 

الكلمة المحجوزة add  كلمة اجبارية في كتابتها 

 

الكلمة المحجوزة data_type مثل date او number او varchar2 هي كلمات  اجبارية في كتابتها 

 

الكلمة المحجوزة default هي كلمة اختيارية اي ممكن نكتبها وممكن لا (سنرى ذلك في المثال التالي)

 

الكلمة المحجوزة constraints  كلمة اختيارية (سنرى ذلك ايضا )

 

المثال الثاني :

 

كيفية اضافة default  على العمود المرغوب فيه ..

 

نرى ذلك من خلال المثال التالي  الذي يوضح اكثر كيف نضيف الكلمة default  ع العمود والتي تعتبر قيمة افتراضية

 

تنضاف الى الجدول عندما لانريد اي قيمه اخرى .. فيقوم باضافة القيمة الافتراضية التي وضعناها في العمود عندما نتسخدم الامر insert

ALTER TABLE orders ADD (status number(2) default 1); 

لقد قمنا باضافة عمود والذي اسميناه status  وهو حالة الطلب هل هو مفعل او غير مفعل وقمنا باعطاءه قيمة افتراضية default  تتمثل في الرقم 1

 

والتي بدروه يمثل انه الامر مفعل .. فعندما نقوم باضافة صف الى الجدول باستخدام الامر insert  اذا لم نعطي قيمة لل status

 

 والا فسوف ياخذ القيمة الافتراضية 1 ويقوم باضافتها الى الجدول كصف جديد.

 

ملاحظة : اذا استخدمت الصيغة التالية لاضافة عمود جديد مع قيمة افتراضية فسوف يعطيك خطا :

ALTER TABLE orders ADD (status default 1 number(2)); 

 لابد ان نكتب نوع البيانات number  قبل القيمة الافتراضية default 

 

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

ALTER TABLE orders ADD(ORDER_DATE date,status number(2) default 1); 

كيفية اضافة not null  الى العمود :

 

اذا اردت ان تنضيف عمود جديد الى الجدول الموجود في قواعد البيانات وهذا الجدول يحتوي على بعض البيانات فيجب ان تعلم شيئا مهما وليكن محفوظا في دماغك ز

 

وهو لايمكن ان نضيف عمود الى الجدول الموجود الذي يحتوي ع بيانات ونعطيه القيد المسمى not null  .. مثال ذلك .

ALTER TABLE orders ADD order_name varchar2(20) NOT NULL; 

عندما ننفذ الكود السابق ع جدول يحتوي مسبقا ع بيانات فانه لايمكن ابدا ان ييتم اضافة هذا العمود ..

 

لكن من الممكن ان نعالج الامر السابق ونجعله يقبل اضافة ذلك العمود المدعوم مع القيد NOT NULL وذلك باضافة قيمة افتراضية  default  الى ذلك العمود 

 

كما في المثال التالي يوضح اكثر

ALTER TABLE orders ADD order_name varchar2(20) default 'BOOKS' NOT NULL; 

حيث ان الصيغة السابقة سوف تقبل بشكل صحيح  لاننا اعطينا قيمة افتراضية  

 

وهي BOOKS  والتي تقوم تلك القيمة الافتراضية بالتعديل في صف موجود في الجدول بنفس الاسم 

 

يتبع .......

 

رابط هذا التعليق
شارك

تابع للدرس السابق ...

 

كيفية تعديل ع الاعمدة :

 

عندما نقول التعديل ع الاعمدة لانعني اننا نقوم بتغيير العمود من اسم الى اسم اخر (هذا يندرج تحت شي اسه rename سنرى ذلك لاحقا ان شاء الله )

 

ولكن المقصود به هنا هو كيفية تغيير نوع البيانات data type  او الدقة والحجم precision and scale

 

ليكن مثلا هذا الجدول لدينا  بالاسماء الاتية :

 

name                                         null                                  type

 

order_id                                                                         number 

 

sales_rep_id                                                                  number

 

order_date                                                              varchar2(20)

 

 

فمثلا في الجدول السابق لدينا العمود order_date  لديه نوع البيانات وهي data type  من نوع varchar2(20)

 

نريد ان نقوم بتغييرها من varchar2(20)   الى نوع date   

 

اذا سوف تكون بالشكل الاتي :

ALTER TABLE orders MODFIY order_date DATE;

حيث ان قمنا بكتابته مباشرة  اي نقوم بكتابه نوع البيانات المراد التغيير اليه دون كتابه النوع البيانات السابق كما هو موضح في المثال ..

 

ومن الممكن ايضا ان نقوم بتعديل اكثر من عمود في نفس الوقت وقد يكونون مختلفيين بالوظيفة  اي ممكن تغير النوع وفي نفس الوقت تغير الدقة والحجم 

 

مثال المثال التالي :

(ALTER TABLE orders MODFIY (orde_date DATE, order_id number(10);

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

 

 

 

كيفية تعديل القيمة not null  او القيد :

 

لاضافة not null  كقيد معين ع عمود يجب ان يكون مع modify  وليس add  مثال ذلك :

ALTER TABLE orders modify order_date DATE not null;

 اذا اردنا مثلا ان نحذف not null  من العمود فاننا لانستطيع ذلك ولكن يمكن ان نقوم بتغييره من not null  الى  null  مثال ذلك :

ALTER TABLE orders modify order_date DATE  null;

نقاط مهمة  يجب  ان تتبع فيها عند التغيير من نوع بيانات الى اخرى او الدقة والحجم :

 

النقطة الاولى :

 

 لايمكن ان نحول او نغيير نوع بيانات العمود  الى number  ع عمود موجود مسبقا عليه بيانات من نوع characters كقيمة نصية

 

النقطة الثانية :

 

لايمكن ان نغيير حجم نوع بيانات من حجم اكبر الى حجم اصغر اذا كان الحجم الاصغر المراد التتغير اليه يوجد به رقم او نص اكبر من الحجم المغير اليه .

 

مثلا :  

 

لدينا نوع بيانات من نوع  number(3)   يحمل الحجم 3 حيث يمكن ان نخزن الارقام فيه  من 0 الى 999  

 

فاذا كان لدينا الرقم 999 موجود ع صف ما. واردنا ان نغير الحجم الى 2 فانه لايمكن لانه يوجد رقم يحمل 3 خانات وهذا خطا.

 

اما عند الزيادة فلا باس بها

 

النقطة الثالثة :

 

التغيير والتعديل من نوع بيانات الى اخر يجب ان يكون العمود خالي لايحتوي ع بيانات والا لايمكن ان نغير ذلك  .

 

فمثلا اذا اردنا ان نغيير من نوع بيانات date  الى varchar2 )20( او العكس فاذا كانت توجد بيانات فانه لايمكن وسوف يعطيك رسالة يبين لك 

 

انه لابد ان يكون العمود خالي اي empty .( سنرى ذلك في حالة لايكون خالي )

 

 

كيفية اعداد تغيير اسم العمود من اسم الى اخر :

 

يمكن ان نغير اسم العمود من اسم الى اخر وذلك باستخدام الامر الاتي وهو rename

ALTER TABLE orders Rename column sales_rep_id to sales_agent_id;

يمكن ان ترى الصورة الاتية التي في الارفاق  لكي توضح لك اكثر حول النقاطة المهمة في حالات الجدول  المختلفة مع نوع التغيير المطروح عليه ..

 

يتبع ...

post-116667-0-72181700-1372202569_thumb.png

تم تعديل بواسطة programmer_85
رابط هذا التعليق
شارك

الدرس الثاني 

 

كيفية حذف الاعمدة drop columns  والتعامل مع الامر unused 

 

 

اولا :كيفية التعامل مع حذف الاعمدة 

 

بامكاننا بعد ان راينا كيفية التعامل مع الاضافة والتعديل على الاعمدة ..

 

من خلال ذلك سنرى كيفية حذف تلك الاعمدة الغير مرغوب فيها .

 

عندما نقوم بحذف اي عمود من الجدول .. فان اي قيود constraints  ع هذا العمود سوف يتم حذفها تلقائيا  عند حذف ذلك العمود .

 

لنرى الصيغة العامة لعميلة حذف الاعمدة 

ALTER TABLE table_name DROP COLUMN column_name;

او ممكن تكون الصيغة بهذا الشكل من دون كتابة الكلمة المحجوزة column  ..بشرط ان يكتب العمود المراد حذفه بين قوسين :

ALTER TABLE table_name  DROP (column_name);

مثال ع ذلك :

ALTER TABLE orders DROP COLUMN order_id ;

OR

ALTER TABLE orders DROP (order_id);

حيث اننا عندما نذكر العمود المراد حذف فاننه نقوم بكتابته دون  ان نكتب نوع البيانات له 

 

عند كتابتك لنوع البيانات له سوف يعطي لك خطا يبين لك ذكر بانك لاتستطيع ان تحذف هذا العمود

 

ملاحظة :

 

يعتبر الفرق بين الصغتين السابقتين هو عندما نكتب الكلمة المحجوزة column  فانك لاتستطيع ان تحذف اكثر من عمود في جملة واحدة ..

 

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

 

من دون الكلمة المحجوزة column  .. نضع ذلك بين قوسين  ومن ثم نذكر الاعمدة التي تريد حذفها .

 

مثال :

ALTER TABLE orders DROP( order_id,order_date);

نقطة مهمة جدا :

 

لايمكن ان تحذف كل الاعمدة التي في الجدول فعلى الاقل يجب ان يكون هناك عمود واحد موجود في الجدول .. 

 

اما اذا ادرت ان تحذف كل الاعمدة فلا يمكن ابدا .

 

 

كيفية التعامل مع التقييد  او مايمسى بـــ   restriction

 

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

 

اما في حالة اذا اردنا ان نحذف عمود وهو في الاصل مقيد بقيد اسمه foreign key  على جدول اخر فان الصيغة السابقة 

 

التي ذكرت لاتستطيع ان تحذف ذلك العمود ولذا فانه العملية سوف تفشل في كيفية حذف هذا العمود 

 

لنضرب مثال يوضح  تلك الفكرة :

 

لدينا هذا الجدول emp  ولدينا جدول dept حيث ولدينا عمود اسمه deptno موجود في كلا الجدولين 

 

حيث ان deptno هو foreign key  في جدول emp 

 

اما في جدول dept  هو primary key 

 

........

 

فعندما نقوم بحذف العمود deptno   فاننا لانستطيع ابدا ان نحذفه بالصيغة السابقة  لسببيين :

 

الاول :  ان العمود deptno  هو في جدول dept  مفتاح اساسي primary key

 

 ولايمكن ان نحذفه مالم نحذف constraints  اولا (سوف نرى ذلك في درس constraints )

 

الثاني:  ان العمود deptno في جدول emp مفتاح اجنبي foreign key

 

مرتبط بجدول اخر وهو dept  ولذا لايمكن حذف اي foreign key طالما انه يشير الى جدول اخر.

 

 

اذا كيف لنا ان نحذف تلك الاعمدة التي  بهذا الشكل ؟؟؟؟

 

الحل هو بامكاننا ان نتسخدم الصيغة السابقة لحذف ذلك لكن بشرط ان نضيف في اخر جملة sql  كلمة محجوزة تسمى CASCADE CONSTRAINTS

 

  وهي تعتتبر من القيود

 

وسوف يكون بالشكل التالي :

;ALTER TABLE emp DROP COLUMN deptno CASCADE CONSTRAINTS

بتلك الجملة سوف يتم الحذف بشكل صحيح وناجح .

 

 

 

يتبع ......

رابط هذا التعليق
شارك

 

جزاك الله كل الخير  فعلاً موضوع رائع وشيق

كما يتميز اسلوبك بالسهولة والمرونة في  الشرح والكتابة

مم يجعل كتابتك مميزة وجودتها في بساطتها

شكراً لك

 

رابط هذا التعليق
شارك

قد تكون هذه المعلومات عند  المحترفين سهلة وتعتبر من الاساسيات 

وقد تكون عند المبتدئين مهمة جدا 

ولكن أجزم بأن من يقرأها لابد ان يستفيد سواء كمراجعة او كتعلم

 

 بصراحة شرح قمة في الابداع 

 

بأنتظار الدروس القادمة

رابط هذا التعليق
شارك

تابع للدرس الثاني 

 

تحدثنا في الجلسة السابقة عند موضوع كيفية التعامل مع حذف الاعمدة drop columns 

 

وتناولنا فيها النقطة الاولى 

 

اليوم ان شاء الله سوف نرى  النقطة الثانية من الدرس الثاني والتي  تعتبر مشابهة كثير الى حدما حذف الاعمدة 

 

الا وهو :: كيفية التعامل مع الامر UNUSED 

 

بدلا من التعامل مع كيفية حذف الاعمدة من الجدول Drop columns  التي لم تعد مناسبة للاستخدام ..

 

فاننا نقدم اليوم درس مشابة له وله حق الافضلية ع حذف الاعمدة الا وهو الامر unused 

 

عندما نقوم باعداد العمود الى unused  فان هذا يعني ان العمود حذف ولم يعد جاهزا للاستخدام 

 

كذا ايضا انا اي قيود constraints علي هذا العمود فانه ايضا تم حذف تلك القيود عندما نعمل العمود ع شكل unused .

 

لايمكن ابدا ع الاطلاق اعادة العمود واسترجاعه بعد ان عمل عليه اعداد unused .

 

حتى ولو استخدمنا الامر flashback (سنرة ذلك الامر في الجلسات التالية)  فانه لايجدئ اي نفع مع الامر السابق لاعادة العمود بعد ان تم اعداد ع شكل unused 

 

من الممكن ان نقوم باضافة عمود جديد يحمل نفس اسم العمود الذي عمل عليه الامر unused  للجدول  

 

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

 

اذا  قد يتسأئل احدنا .. طالما انه يوجد هناك امر للحذف وهو drop فلماذا نحتاج الى امر مشابة له الى حد ما وهو unused 

 

الامر عائد الى اسباب  منها ::

 

ان التنفيذ والاداء للامر drop column  يكون مضادا في اعداد االامر unused   كيف ذلك؟؟

 

لناخذ مثال  : 

 

انت تعمل ع جدول كبير جدا من ناحية الاعمدة اي يحتوي ع اعمدة كبيرة جدا .. وانت ادرت ان تحذف بعض الاعمدة 

 

فربما انك قد تجد عملية التنفيذ والاداء في drop column  هو غير مقبول بشكل موقت ... ولاسيما اذا كان النظام ثقيل جدا من ناحية الانتاج

 

عندها يوجد البديل وهو هذا الامر set unused  وذلك لان التنفيذ والاداء فيه سريع جدا ....

 

لكن يجب ان تكون هناك نقطة في دماغك ؟؟؟

 

هي ان الجدول يحتوي ع اكثر عدد من الاعمدة 1000 عمود  فاذا قمت باعداد مثلا عمود واحد ع شكل unused

 

فان هذا العمود لازال محسوبا ضمن  1000 عمود بعكس ذلك عندما تستخدم الامر drop column

 

الصيغة العامة  للامر set unused

ALTER TABLE table_name SET UNUSED COLUMN column_name; 

مثال ع ذلك :

ALTER TABLE orders SET UNUSED COLUMN order_id; 

او من الممكن ان تعمل اكثر من عمود باستخدام الامر set unused  من دون كتابة الكلمة المحجوزة column  وكتابة ذلك بين قوسين (راينا ذلك في الدرس السابق )

ALTER TABLE ordes SET UNUSED (order_id,order_date); 

وكما راينا ايضا سابقا باننا لايمكن ان نحذف كل الاعمدة من الجدول .. فعلى الاقل يبقى هناك  عمود واحد ..

 

ايضا الامر set unused  له تلك الخاصية لايمكن حذف كل الاعمدة من الجدول (راجع ذلك في الدرس السابق )

 

من الممكن ان نرى ماهي الاعمدة التي تم عليها set unused  في الجدول .. وذلك من خلال  data dictionary وهي 

 

user_unused_col_tabs

 

عند استخدامك للــ data dictionary  ( user_unused_col_tabs)  فانه لايمكن ان يعطيك ماهي الاعمدة الت تم عليها الامر set unused

 

وانما يعطيك  ماهي اسماء الجداول التي تم على اعمدتها او بعض اعمدتها الامر set unused .. اضافة الى عدد الاعمدة التي تم عليها الامر set unused .

 

مثال :

desc  user_unused_col_tabs;

نقطة اخيرة ومهمة جدا :

 

وهي كما ذكرنا سابقا بان العمود التي اعد عليه الامر set unused  فانه لايمكن ابدا استرجاعه ولايمكن ايضا معرفة هوية ذلك العمود او تحديده .

 

لكن من الممكن ان نقوم باستخدام الامر drop لحذف الاعمدة التي هي  set unused 

 

يمكن ان نتسخدم الصيغة العامة :

ALTER TABLE table_name DROP UNUSED COLUMNS; 

حيث ان الكلمات المحجوزة الثلاثة تبقى كما هي   DROP UNUSED COLUMNS

 

مثال يوضح اكثر ..

ALTER TABLE orders DROP UNUSED COLUMNS; 

حيث ان المثال السابق يقوم بحذف تلك الاعمدة كليا سواء كانت 1 او 2 او اكثر جمعا التي اعد عليها الامر SET UNUSED .

 

يتبع ...

 

 

رابط هذا التعليق
شارك

الدرس الثالث 

 

كيفية التعامل مع اضافة القيود (add constraints )

 

لاشك انا عندما نقوم بانشاء جدول فاننا نقوم في بعض الاحيان باضافة بعض القيود منها مثلا ع سبيل المثال :

 

المفتاح الاساسي primary key 

 

المفتاح الاجنبي foreign key 

 

الفحص  check 

 

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

 

فهذا يجعل الامر صعب جدا ومعقد ..

 

لحل تلك المشكلة بامكاننا ان نتسخدم الامر الامر ALTER TABLE  لاضافة القيود او حذفها او التعديل عليها  لنرى ذلك سويا ..

 

 

 النقطة الاولى :كيفية اضافة القيود ( add constraints )  باستخدام الامر ALTER TABLE ؟؟

 

عندما مثلا نقوم بانشاء جدول واضافة القيود عليه .. فان اضافة القيود عليه لها طريقتين ::

 

الطريقة الاولى :  تسمى In -line  وهي التي تكتب اضافة القيود بعد نوع البيانات للعمود مباشرة 

 

مثلا :

CREATE TABLE EMP (
EMPNO NUMBER(3) PRIMARY KEY,
ENAME VARCHAR2(20) NOT NULL);

الطريقة الثانية : تسمى Out-line  وهي عكس الطريقة الاولى حيث ممكن ان نضيف قيد معين بعد اضافة كل الاعمدة 

 

مثلا :

CREATE TABLE emp ( empno number(4),ename varchar2(20),
constraint empno_pk primary key (empno));

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

 

الان : لنعيد قليلا  الى كيفية انشاء جدول باستخدام الامر create table من دون اضافة قيود 

 

مثال عل ذلك :

CREATE TABLE  OREDERS (
ORDER_ID number,
SALES_REP_ID NUMBER,
ORDER_DATE date,
CONFIRMATION_DATE date);

الان وبعد ان قمنا بانشاء جدول باستخدام الامر create table   نقوم باضافة القيود add constraints  باستخدام الامر alter  table 

 

المثال الاول :

 

كيفية اضافة قيد وهو primary key باستخدام الامر alter table  على العمود  order_id

 

حيث ان الطريقة المستخدمة في المثال التالي هي In-line  

ALTER TABLE orders modify order_id PRIMARY KEY;

كما انا بامكاننا ان نستخدم الطريقة السابقة In-line  كما هي في المثال السابق باضافة كلمة محجوزة وهي constraint 

 

مثال ع ذلك :

ALTER TABLE orders Modify order_id Constraint pk_new_constraint PRIMARY KEY;

حيث ان المثالين السابقين يعتبران متشابهان في شي وهو استخدام الطريقة In-line 

 

لكن ماهو الفرق بين المثال الاول والمثال الثاني الذي لايحتوي ع اضافة الكلمة  المحجوزة constraint ؟؟؟

 

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

 

سوف يقوم مايمسى بـــ pre_defined  اي النظام باعطاء اسم تلقائيا للقيد ع العمود order-id  وهو المفتاح الاساسي primary key 

 

اما في المثال الثاني فقد قمنا باضافة الكلمة المحجوزة constraint  واعطيناها اسم وهو pk_new_constraint  الخاص بــ primary key

 

وهو يسمى user_defined  ..

 

عند الاستعراض في data dictionary حول ذلك سوف يوضح اكثر  في الاسم (سنرى ذلك لاحقا ان شا ءالله )

 

الطريقة الثانية : وهي out-line   وهي تعتبر اضافة القيد منفصلا عن العمود الذي اعد له القيد 

 

مثال :

ALTER TABLE orders ADD constraint pk_new_constraint primary key(order_id); 

لاحظ ان في هذا المثال لم نتسخدم الامر modify على العمود order_id  وانما استخدمنا الامر  add

 

 وهو بذلك يقوم باضافة قيد constraint  على عمود وليس اضافة عمود.

 

اذا لدينا الان طريقتين بامكاننا كيفية اضافة القيود constraints على النوع الاول منها وهو primary key 

 

يبقى هنا سوال يتحير في اذهاننا ..!!!!

 

وهو انه طالما توجد طريقتين بنفس النمط والشكل .. فلماذا نحتاج الى الطريقة الثانية او الاولى .. لماذا نحتاج الى in-line مادام موجودة out-line  او العكس ؟؟

 

الجواب هنا .......!!!!

 

نحن عملنا الان اضافة القيد فقط على النوع الاول وهو primary key   باستخدام الطريقتين in-line و out-line 

 

لكن في الامثلة السابقة عملنا فقط كيفية اضافة primary key على عمود واحد فقط .. اذا هل من الممكن ان نضيف primary key على اكثر من عمود في نفس الوقت ؟؟

 

من المعروف ان الــ primary key  يكون فقط واحد في جدول ولايمكن ان يكون اكثر من ذلك ...!!!

 

لكن توجد هناك طريقة لاضافة القيد  primary key  على اكثر من عمود الا وهي :  composite primary key   المفتاح الاساسي المركب 

 

لكن هذه الطريقة وهي  composite primary key  لايمكن فعلها الا فقط ع الطريقة الثانية وهي out-line  ام in-line  فلايمكن ابدا ..

 

لهذا السبب تم اضافة تلك الطريقتين ..

 

 

مثال يوضح اكثر حول اضافة composite primary key   ع اضافة اكثر من عمود ...

ALTER TABLE orders ADD Constraint pk_new_constraint 
primary key (order_id,order_date); 

ملاحظة :ان  طريقة اضافة composite primary key لايمكن ابدا ان تكون الا مع الطريقة الثانية out-line  .

 

يتبع ..............

 

 

رابط هذا التعليق
شارك

تابع للدرس السابق 

 

كيفية اضافة القيد المسمى NOT null

 

ان العمل ع اضافة القيد not null  له بعض العيوب او التقييد مع الامر alter table ...

 

حيث اننا قد وضحنا فيما سبق ونعيد ذلك هنا ان اضافة القيد not null  لايمكن ان يكون فقط الا ع الطريقة الاولى وهي in-line 

 

اما طريقة out-line كما وضحنا فلايمكن ابدا 

 

مثال ع ذلك ..

ALTER TABLE orders Modify order_id not null;

او ممكن يكون كالاتي مع اسم القيد constraint 

 

مثال ع ذلك 

ALTER TABLE orders Modify order_id Constraint nn_ord_id NOT NULL

اماذا ادرنا ان ننفذ القيد NOT NULL  بهذا الطريقة وهي الطريقة OUT-LINE  فلايمكن ابدا 

ALTER TABLE orders ADD Constraint nn_ord_id NOT NULL (order_id);

حيث نستنتج من ذلك ان طريقة out-line  التي قد تكون في الامر alter table  او الامر create table  لايمكن ابدا ان تعمل مع القيد not null .

 

فقط طريقة in-line  هي التي تعمل مع القيد not null  سواء كان في الامر alter table  او الامر create table .

 

ملاحظة : االقيد not null  كما اشارنا سابقا بانة لايمكن ان يكون الافقط ع الطريقة  in -line

 

 لهذا السبب فانه لايمكن ان نضيف اكثر عمود في نفس الوقت ونعمل عليه القيد not null 

 

 

كيفية ااضافة القيد constraint  ع الفحص check 

 

ان القيد check يعمل فقط على الطريقة out line  اي بعكس القيد not null  

 

مثال ع ذلك :

ALTER TABLE orders  ADD Constraint ck_order-date CHECK(order_date <=confirmation_date);

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

 

الغرض من ذلك هو كيفية اضافة هذا القيد وعلى اي طريقة يمكن ان يكون وقد وضحنا ذلك .

 

كيفية اضافة القيد foreign key 

 

ان اضافة القيد foreign key   ع عمود يجب ان يكون له علاقة او مرجع يشير الى ان العمود موجود او لدية العلاقة مع جدول اخر  

 

وهذا معروف في ذلك .. حيث ان وظيفة القيد foreign key  هو انشاء العلاقات بين الجداول .. 

 

وحيث ان الطريقة الثانية وهو out-line  التي تتطبق ع القيد  foreign key  

 

لناخذ مثال ع ذلك ..

ALTER TABLE orders ADD Constraint fk_order_sales_rep
 FOREIGN KEY (sales_id)
REFERENCES sales_agents (sales_id);

حيث ان العلاقة تتم من خلال علم هذا القيد foreign key ع ربط اكثر من جدول 

 

وليس من الضروري ان تكون اسماء الاعمدة هي نفس بعضها البعض في كل جدول من ناحية الاسم ...

 

ملاحظة مهمة جدا:

 

عندما نريد ان نقوم بتعديل ع قيد معين .. واقصد بالتعديل هنا هو ان  القيد قد تم عمله

 

ع عمود ما ولكن اردنا ان نعدل ذلك  العمود من مثلا not null  الى null  او غير ذلك 

 

فان في الاصل في هذا الموضوع لاتوجد  اي تعديل ع اي قيد constraint

 

 وانما نقوم بحذف هذا القيد ومن ثم نقوم بانشاء قيد الذي نرغب فيه ع  العمود باستخدام الامر 

 

alter table .... 

 

يتبع ..........

رابط هذا التعليق
شارك

تابع  للدرس السابق 

 

كيفية ازالة وحذف الـــقيود constraints 

 

لازالة وحذف القيود constraints  يمكت ان نتسخدم ايضا الامر alter table .

 

اولا : كيفية حذف المفتاح الاساسي  drop primary key .

 

عندما نريد ان نحذف اي primary key  فانه لايلزم ان نذكر اسم القيد المخصص بالــ primary key  وانما فقط

 

نذكر الــ primary key كما هو مبين في الصيغة العامة الاتية .. حيث ان الجدول المعطى هو لديه فقط واحد primary key .

 

الصيغة العامة :

ALTER TABLE table_name DROP PRIMARY KEY options; 

حيث ان options يتمثل في الاتي:

 

1- cascade    سوف يقوم بحذف اي قيد مستقل . من جهة اخرى ان foreign key  قد يشير الى primary key 

 

فبااستخدام الكلمة المحجوزة cascade نستطيع ان نحذف اي foreign key متعلق بــ primary key  في الجدول الثاني ..

 

مثال :

ALTER TABLE orders DROP PRIMARY KEY CASCADE;

2- Keep Index or Drop Index  هنا الــ primary key يكون متعلق ومتربط بالفهرس index 

 

حيث ان هذا الخيار يشير لك اذا ماادرت ان تحذف اي index عند حذفك للــ primary key او لا 

 

حيث ان القيمة الافتراضية default هي حذف  اي index متربط مع الــ primary key  عند حذفنا للــ primary key 

 

مثلا :

ALTER TABLE orders DROP PRIMARY KEY ;

OR

ALTER TABLE orders DROP PRIMARY KEY cascade drop index;

في حالة اذا اردت ان تحذف اي index متربط بالــ primary key  فلك خيارين  كما هو موضح في المثال السابق .

 

 

اما ادرت ان تحتفظ بهذا index عند حذفك لاي primary key فيمكن ان نتستخدم الخيار keep index 

 

مثلا :

ALTER TABLE orders DROP PRIMARY KEY cascade keep index;

ثانيا كيفية حذف القيد Unique constraint

 

ايضا لحذف اي unique انت لاتحتاج ان تذكر اسم القيد هنا .. فقط قائمة  الاعمدة التي تشتمل ع هذا القيد

 

الصيغة  العامة :

ALTER TABLE table_name DROP UNIQUE (col1,col2,col3,...)options; 

حيث ان options  هنا هي نفسها التي توجد في حالة primary key (انظر الى كيفية حذف القيد primary key )

 

مثلا :

ALTER TABLE orders DROP UNIQUE (order_id,order_id_rep)cascade drop index; 

ثالثا : كيفية ازالة القيود constraints  باستخدام الامر alter table... drop..

 

في النقطيتين التي سبقت لاحقا راينا فقط كيفية ازالة القيد primary key  والقيد unique  

 

لكن هنا سو نرى كيفية ازالة القيود constraints  التي تم عملها على مثلا primary key 

 

لدينا الصيغة العامة :

ALTER TABLE table_name DROP CONSTRAINT constraint_name options; 

حيث ان هنا options مقصود بها فقط cascade  ... 

 

يجب ان نفرق بين النقطينت الاولتين والنقطة الاخيرة حيث ان الاولتين تهتم فقط بحذف primary key  او unique  

 

اما النقطة الثانية فهي تهتم فقط بكيفية حذف اسم القيد التي تم عمله ع primary key  بواسطة المستخدم او النظام

 

اي ان المستخدم او النظام قام باعطاء اسم للــ primary key  اسمه مثلا pk_cons  الان نريد ان نحذف هذا اسم القيد

 

مثلا  :

ALTER TABLE orders DROP CONSTRAINTS pk_cons cascade; 

كيفية حذف القيد not null.

 

كما بينا سابقا باننا لايمكن ابدا ان نحذف القيد not null وانما باستطاعتنا ان نقوم بتغييرة من not null الى  null

 

وقد بينا ذلك سابقا في احد الدورس السابقة (راجع ذلك لتعرف اكثر )

 

ولايمكن ان نتسخدم الكلمة المحجوزة drop او الكلمة المحجوزة ايضا add 

 

وانما فقط  الكلمة المحجوزة modify   لان القيد not null  لاتعمل مع الطريقة  out-line 

 

مثال ع ذلك :

ALTER TABLE orders MODIFY order_date null 

..............

 

يتبع ......

 

تم تعديل بواسطة programmer_85
رابط هذا التعليق
شارك

تابع للدرس السابق 

 

كيفية العمل مع التمكين والتعطيل ع القيود disabling and enabling constraints

 

في بعض الاحيان انت تريد ان تغير بعض الاشياء ع القيود ولكن ليس بشكل ضروري ان 

 

نقوم بحذف هذا القيد .. لان الحذف يجعل من القيد منتهي تماما .. ولكن ربما اننا نريد ان نجعل بعض القيود في حالة غير موثرة وفعالة 

 

لوقت محدد .. في هذة الحالة يمكن ان نتسخدم  disabling and enabling constraints .

 

مثلا :

 

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

 

ان نتسخدم تلك  disabling and enabling constraints للوقت المحدد لتلك البيانات .

 

اولا : التعطيل disabling  

 

دعونا اولا نقوم بانشاء جدولين بينهما علاقة وهما مثلا 

 

جدول ports وجدول ships 

CREATE TABLE PORTS
(port_id number(7),
port_name varchar2(20),
CONSTRAINT pk_ports PRIMARY KEY(port_id));

الان جدول ships

CREATE TABLE SHIPS(
ship_id number(7),
ship_name varchar2(20),
home_port_id number(7),
CONSTRAINT pk_ships PRIMARY KEY (ship_id),
CONSTRAINT fk_sh_po FOREIGN KEY (home_port_id) REFERENCES PORTS(port_id));

نقوم الان باضافة بعض الصفوف ع الجدولين 

 

اولا  نضيف صفين على الجدول ports

INSERT INTO PORTS VALUES(50,'aden');
INSERT INTO PORTS VALUES(60,'mukalla');

نقوم الان باضافة صف واحد على الجدول ships

INSERT INTO SHIPS VALUES (10,'ahmed's ship',50);

بعد ان قمن باضافة تلك الصفوف بنجاح  .. الان 

 

لايمكننا ان نحذف الصف ports الذي لديه علاقة مع الصف في جدول ships

 

مثلا :

DELETE FROM PORTS WHERE port_id=50;

عندما نقوم بتنفيذ الجملة السابقة وهي جملة الحذف فانه لايمكن ابدا 

 

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

 

اخر مرتبط به اي بينهما علاقة في جدول اخر وهو جدول ships.

 

بطريقة اخرى : نقول ان الصف الذي في جدول ports  يسمىparent  

 

والصف في جدول ships  الذي مرتبط بالصف في جدول ports يسمى child

 

لو تاملنا في المثال السابق ان القيد المسمى foreign key  هو الذي سبب المشكلة في ذلك 

 

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

 

اذا فكيف يمكن لنا ان نتعامل مع هذا القيد .. ؟؟

 

لاحظ قبل البداية في حل المشكلة الاولى  ..

 

ان لدينا مثلا المثال االتالي وهو يقوم بحذف صف من الجدول ports

DELETE FROM PORTS WHERE port_id=60;

حيث ان port_id  والذي يساوي 60 نستطيع ان نحذفه بسهولة دون اي مشاكل .. والسبب يعود ان هذا الرقم 

 

ليس لديه اي رقم اخر او مرتبط به او علاقة بينهما في جدول  ships

 

اذا فهل من الممكن ان نحذف اي صف من الجدول ships 

 

بالتاكيد نعم نستطيع ان نفعل ذلك والسبب يعود ان الصفوف في الجدول ships  تسمى child  

 

اذا طالما انه child  فانه من الممكن حذفه بغض النظر عن foreign key .. عكس ذلك اذا كان في جدول 

 

ports لانه الجدول الاساسي parents  طالما ان بعض الصفوف لديها علاقة من الصف في جدول ships راينا ذلك .

 

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

 

فهل من الممكن ان لانحذف ولانستطيع ان نفعل ذلك ؟؟ 

 

من خلال disabling and enabling يمكن ان نفعل ذلك ..

 

نقوم فقط بتعطيل القيد foreign key  لفترة محددة حتى نحذف الصف الغير مرغوب من جدول ports

ALTER TABLE ships disable CONSTRAINT fk_sh_po;

حيث ان القيد fk_sh_po  هو اسم القيد الذي يتعلق ب foreign key  عندما قمنا بانشاءه باستخدام الامر create table 

 

اذا الان نستطيع ان نحذف الصف الذي لم يحذف من قبل .

DELETE FROM PORTS WHERE port_id=50;

وهكذا نجعل هذا القيد في حالة التعطيل حتى ننهي مانريد ومن ثم اذا رغبنا في اعادة ذلك الى انشاءه الاصلي 

 

نستخدم enable  constraint  سنرى ذلك في الدرس التالي ان اشاء الله .

 

 

يتبع ............

رابط هذا التعليق
شارك

  • بعد 2 أسابيع...
  • بعد 2 سنة...

جزاك الله خيرا على هذا المجهود الرائع وجعله الله في ميزان حسناتك يوم القيامه 

وأردت المشاركه باي شيء فقمت بتنسيق هذا الكلام في ملف وورد وهو في المرفقات 

alter.rtf

رابط هذا التعليق
شارك

  • بعد 6 شهور...
  • بعد 1 شهر...

ياشباب بالله عليكم ضروري اريد عمل بروسيدجر procedure من خلاله استطيع عمل لوحة مفايح الهاتف بمعني عند الضغط على الزر 2لأول مرة يظهر 2 وعند الضغط عليه مرتين يظهر الحرف A وهكذا ممكن ضروري جزاكم الله خيرا

تم تعديل بواسطة خالد العجمي
رابط هذا التعليق
شارك

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   تمت استعادة المحتوى السابق الخاص بك.   مسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

جاري التحميل
×
×
  • أضف...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية