الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف تحذف عمود من الجدول دون أن تؤثر على أداء قاعدة البيانات

مغلق
بدأه ayman_zaki في 31 يناير 2003 · 8 رد · 906 مشاهدة · في قواعد بيانات Oracle
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

قبل oracle 8i، كانت عملية إلغاء عمود من جدول معين أمراً مستحيلاً، وربما سبب ذلك بعض المشاكل النسبية للمستخدمين لأن ذلك يضطرهم أحياناً لإعادة تكوين الجدول من جديد، أي إعادة تعريف الindexes و الconstraints أيضاً(كله من أجل عمود أو عمودين!!!! ) :eek:

أما في oracle 8i وما بعدها، فيمكنك إلغاء عمود بكل سهولة (بالنسبة لك طبعاً) باستخدام التعليمة التالية :

ALTER TABLE                  table_name 
DROP COLUMN            column_name
[CASCADE CONSTRAINTS]       //1//
[CHECKPOINT n]                          //2//
[INVALIDATE]                              //3//

يضاف (1) في حال وجود تكاملات مرجعية(FK).

أما(2) فتضاف عندما ترغب في التقليل من استخدام ال UNDO SPACE ، و ذلك بعمل checkpoint كل n سطر.

أما (3) فإنها تكتب لجعل كل الobjects المتعلقة بهذا العمود (views, indexes,….) في حالة INVALID.

ملاحظة : أثناء تنفيذ التعليمة السابقة لا يمكن لأي مستخدم استخدام الجدول الذي يتم فيه حذف العمود،لأن الجدول يوضع في حالة INVALID حتى انهاء التنفبذ.

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

لنفترض كالعادة أنك تدير قاعدة بيانات ضخمة ، و قد طلب منك حذف أحد الأعمدة( أو أكثر) من الجداول، وفي نفس الوقت أنت لا تريد وضع المستخدمين في حالة انتظار ريثما تنتهي عملية الحذف التي ربما تأخذ فترة لا بأس بها.

توجد طريقة عملية جداً يمكنك اتباعها:

1- قم بوضع العمود في حالة (unused) كما يلي:

ALTER TABLE table_name SET UNUSED COLUMN col_name
[CASCADE CONSTRAINTS]  ;

هنا أصبح العمود في وضع المحذوف، أي أنه لا يمكنك أن ترى أي معلومات عن العمود سواء قمت بالاستعلام أو حتى لو استخدمت تعليمة DESC table_name !!!تذكر أن هذه العملية لا يمكن الرجوع عنها بعد تنفيذها.

2- الآن، و بعد أن يخف النشاط على قاعدة البيانات ( أي بعد نهاية الدوام يا شاطر) :cool: يمكنك حذف العمود فعلياً:

ALTER TABLE table_name DROP UNUSED COLUMNS
[CHECKPOINT n]  ;

و السلام.........:)

#2

سؤال على الموضوع : إذا كان حظك (متنيل و هباب :( ) و حدث instance failure أثناء تنفيذ تعليمة الحذف

فإنه عند إعادة تشغيل قاعدة البيانات يبقى الجدول في حالةINVALID كون العملية لم تنته. :eek:

ما هي التعليمة التي تستخدمها لإتمام العملية؟و ما هو الview الذي يمكنك من خلاله معرفة الجداول التي لها حالة INVALID؟؟؟؟

#3

من على مستوى المستخدم SYSTEM قم بعمل الآتي

select owner,object_name,object_type, status

from all_objects 

where status = 'INVALID';
#4

الأخ السني...(f)(f)(f)

ما شاء الله عليك،طريقة ما خطرت عالبال ...

بس أضيف عليها view مخصص لهذه الحالة بالذات،

و هو DBA_PARTIAL_DROP_TABS .

وين جواب السؤال الأول؟

#5

You can recompile the invalid objects

#6

how can i recompile an invalid table????? :confused:

#7

شكلكم ما تجاوبون: :rolleyes:

إذا أردت إتمام عملية الحذف :

ALTER TABLE table_name DROP COLUMNS CONTINUE

#8

لتسهيل الأمر عليك، ولتعرف ماهي ال objects اللى عندك فيها مشاكل، روح لعند ال DBA STUDIO ومن هناك ادخل على المستخدم SYSTEM ثم روح لعند النوع الذي تريد التأكد منه (Procedure, Veiw or what ever) ثم روح من عند للمستخدم الذي تريد، وسترى في القائمة باليمين، بيانات ال OBJECT كاملة، فإن كان INVALID قم بالنقر عليه مرتين، لفتحه، ثم قم بعملية اعادة الكوبايل بالنقر على compile. وهدي طريقة تخفيفا للتعقيدات.

أما من مستوى ال SQL فيمكنك ذلك عن طريق اعادة أمر بناء ال OBJECT مع اضافة (CREAT OR REPLACE object_type) في بداية الأمر

أرجو ان تكون وضحت

#9

يظهر اننا كنا نكتب في وقت واحد، وكمان يظهر اني ما فهمت سؤالك بشكل صحيح ولا الغرض منه ;)

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…