You are on page 1of 192

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

‫الجزء الول‬

Obay Salah Mirgani (Oracle 10g DBA OCP)

obaysalah@hotmail.com

1
‫الفهرس‬

‫الصفحة‬ ‫الموضوع‬ ‫المسلسل‬

3 ‫الهداء‬ 1

4 ‫المقدمة‬ 2

6 ‫مكونات قاعدة البيانات أوركل‬ 3


Oracle Architectural Components

27 ‫إنشاء قاعدة البيانات أوركل‬ 4


Creating an Oracle Database

47 ‫التحكم فى قاعدة البيانات‬ 5


Controlling the Database

63 Managing Tablespaces and Data files 6

79 Control File & Redo Log Files 7

100 ‫إدارة المستخدمين‬ 8


Administering Usersِ

126 ‫تأمين ومراقبة قاعدة البيانات‬ 9


Oracle Database Security & Monitoringِ

160 Oracle Net Services & Database Link & metrlized View 10

189 Undo Management & Flashback Technology 11

2
‫الهداء‬

‫تكاد ُتحــرق من اشواقنا‬ ‫جنا رسائلنا‬


‫دب ً‬
‫إلى ِرحـــابك ً‬
‫لهبا‬
‫وقبلها قد بعثنا الدمــع‬ ‫يا قارئ الحرف اهديناك احرفنا‬
‫منسكبا‬
‫مهرا ً وإل قد بعثنا القلب‬ ‫شوقا ً إليك فهل ترضـى محبتنا‬
‫والهدبا‬
‫ومن دمانا كتبنا الشعر‬ ‫فغيرنا بمداد الحــبر قد كتبوا‬
‫والخطبا‬

‫‪3‬‬
‫المقدمة‬

‫هذا هو الجزء الول من الكتاب العربى لدارة قاعدة البيانات اوركل والذى هو على‬
‫جزئين ‪ ،‬وحسبى من هذا الكتاب أنى كتبته لى ولمثالى ‪ ،‬فأنا اول المستفدين منه ‪ ،‬فإنى‬
‫اعود له كل مره وقد خططته بيدى فأجد فيه المعلومة الشاردة التى تعودت أن اصل اليها‬
‫بعد بحث عميق‪.‬‬

‫هذا الكتاب يقول لك هكذا تنجز مهامك فى إدارة قاعدة البيانات بأسط الطرق‬
‫وبأقل جهد ودون ًتكلف او تعقيد ‪ ،‬حاولت أن اتناول فيه المادة العلمية بإسلوب سهل‬
‫بسيط ؛ فكنت احيانا ً أجمع عدة مواضيع فى فصل واحد لرتباطهما فى الفكرة والمضمون‬
‫‪ ،‬واحيانا ً اقدم واحيانا ً ُارجئ الى حيث تكون المعلومة افيد واقيم‪.‬‬

‫أما الجانب العملى فكان له اًوفر الحظ والنصيب ‪ ،‬فقد طرحته فى شكلين ‪ ،‬الول‬
‫كتابة النصوص العملية فى قوالب بحيث يستطيع القارئ نسخها وتنفيذها او تعديلها متى‬
‫شاء ‪ ،‬والثانى صور لتنفيذ النصوص على محرر ال ‪ SQL*PLUS‬لتثبت لك الفكرة بأكثر من‬
‫طرح‪.‬‬

‫املى أن يستفيد القارئ العربى من هذا الكتاب الذى ناقشت فيه جزء من اهم‬
‫ى الجزء الخر سوف اطرحه فى‬ ‫المواضيع المتعلقة بإدارة قاعدة البيانات اوركل ‪ ،‬وبق َ‬
‫مد الله لنا فى العمار‪.‬‬
‫ً‬ ‫ا‬ ‫لو‬ ‫ً‬ ‫ا‬ ‫قريب‬ ‫الجزء الثانى من الكتاب والذى سوف يكون بين يديك‬

‫وقبل البدء لى عندك طلب ايها القارئ ‪ ،‬دعوة خالصة منك أن يعفو الله عنى‬
‫فإنى ل أعلم أحد عنده من الذنوب مثل ما لدى ولكن أسأل الله أن يديم علينا ستره فى‬
‫الدنيا والخره‪.‬‬

‫كتبه أبى صلح ميرغنى )لباشا(‬

‫‪4‬‬
5
‫عند الحديث عن قواعد البيانات لبد من البدء عن مكونات قاعدة‬
‫البيانات وطريقة عملها حتى يتسنى لنا بعد ذلك الحديث عن التفاصيل التى ل‬
‫يمكن إستيعابها حتى نفهم تكوينها وطريقة عملها أول ً ‪.‬‬

‫ً‬

‫‪6‬‬
‫‪Oracle Instance‬‬ ‫‪Oracle Database‬‬

‫قاعدة البيانات اوركل تتكون من جزئين رئيسيين وهما ‪ Oracle Instance‬و ‪Oracle‬‬
‫‪ Database‬وسنتحدث عن كل منها بالتفصيل فيما بعد ‪.‬‬

‫‪7‬‬
:Oracle Instance 1.1

8
‫وهى تتكون من جزئين رئيسيين كما فى الشكل اعله ‪-:‬‬
‫‪Memory‬‬ ‫•‬
‫‪Structure‬‬
‫‪Background‬‬ ‫•‬
‫‪Processes‬‬

‫‪:Memory Structure 1.1.1‬‬

‫وهى تتكون لحظة فتح ال ‪ Instance‬وهى عبارة عن جزء من الذاكرة يتم تخصيصه‬
‫لعمل قاعدة البيانات اوركل وهى تتكون من جزئيين ‪-:‬‬

‫‪SGA) System Global Area)-1‬‬


‫‪(Program Global Area (PGA -2‬‬

‫‪:System Global Area (SGA) 1.1.1.1‬‬

‫وتسمى ايضا ً ‪ Shared Global Area‬وهى جزء من الذاكرة يخصص للمعلومات‬


‫التى تكون مشتركة ومتاحة لجميع مستخدمى قواعد البيانات ‪ ،‬وتحتوى على‬
‫معلومات التحكم التى تستخدم من قبل ال ‪ Oracle Server‬وهى تتكون فى ال‬
‫‪ Virtual Memory‬وتتكون لحظة فتح ال ‪ ، Instance‬ومقاس هذه الذاكرة يتحدد‬
‫بواسطة المتغير ‪ SGA_MAX_SIZE‬فى ملف المتغيرات )‪ ، (Parameter File‬وهى‬

‫‪9‬‬
‫ أى يمكن تغيير مقاسها دون إغلق قاعدة البيانات وهى تتكون من‬Dynamic ‫ذاكرة‬
-: ‫قسمين‬
Mandatory Memory -1
Optional Memory -2

Mandatory Memory :
‫ ويتم التحكم فى مقاس هذه الذاكرة بواسطة المتغير‬:Shared Pool -1
: ‫ وتحتوى على جزئين‬، SHARED_POOL_SIZE
Library Cache -1
Data Dictionary Cache -2
‫ ويتم التحكم فى مقاس هذا الجزء من‬: Database Buffer Cache -2
. DB_CACHE_SIZE ‫الذاكرة بواسطة المتغير‬
ALTER SYSTEM SET DB_CACHE_SIZE = 96M;

. ‫وهكذا باقى اجزاء الذاكرة يتم التعديل بنفس الطريقة السابقة‬


‫ ويتم تحديد مقاس هذا الجزء من الذاكرة بواسطة‬Redo Log Buffer -3
. LOG_BUFFER ‫المتغير‬

Optional Memory :
Large Pool -1
Java Pool -2
Streams Pool -3

: SGA ‫والجدول أدناه يوضح أجزاء الذاكرة‬

SGA Component Size Controlled By Areas Of Influence Simple Descriptions

10
Shared Pool SHAREAD_POOL_SIZE Library cache Oracle need to allocate
Shared SQL Areas* & deallocate memory
Oracle 6 thru 10g Private SQL Areas* as SQL or Procedural
PL/SQL Procedures* Code is executed based
and Packages on the individual needs
Various Control* of users sessions and in
Structure accordance to the LRU
algorithm

Highly accessed
memory structure that
Dictionary Cache provide information on
Row Cache * object structure to
SQL statements being
parsed
Redo Log Buffer LOG_BUFFER Redo entries * Holds changes made to
data and allows for
Oracle 6 thru 10g reconstruction of data
in the case of failure
Database Buffer DB_2K_CACHE_SIZE Write List * Holds copies of data
Cache DB_4K_CACHE_SIZE LRU List * requested by SQL and
DB_8K_CACHE_SIZE reduces requests to disk
DB_16K_CACHE_SIZE by having data in
Oracle 6 thru 10g DB_32K_CACHE_SIZE memory
DB_KEEP_CACHE_SIZ You may have many
E different buffer caches
DB_RECYCLE_CACHE that help segregate on
_SIZE usage patterns
Large Pool LARGE_POOL_SIZE Shared server * For large memory
Oracle XA * allocations
I/O Server Processes
Form Oracle 8i Backup & Restore
Java Pool JAVA_POOL_SIZE Run stats* Memory available for
Methods* the java memory
From Oracle 8i Classes* manager to use for all
Session code* things Java
Data in JVM
Streams Pool STREAMS_POOL_SIZE Stream activity* New to Oracle 10g
Memory available for
From Oracle 10g Stream Processing

11
‫يمكن معرفة مقاس ال ‪ SGA‬بالنظر فى ملف المتغيرات )‪ ، (Parameters File‬او‬
‫عن طريق كتابة المر التالى ‪-:‬‬
‫‪SQL> SHOW SGA‬‬

‫‪:Related Views‬‬
‫* ‪V$SGA‬‬

‫‪:Program Global Area (PGA) 1.1.1.2‬‬


‫وتسمى أيضا ً ‪ Process Global Area‬وهو جزء من الذاكرة يتكون خارج‬
‫ال ‪ Instance‬وهو يحتوى على معلومات خاصة لل ‪ Server Process‬الحالى ويتكون هذا‬
‫الجزء من الذاكرة لحظة إنشاء ال ‪ Server Process‬وتنتهى لحظة إنتهاء ال ‪Server‬‬
‫‪ . Process‬وهذا الجزء ليس متاحة لباقى المتصلين أى لكل ‪ Server Process‬فى‬
‫قاعدة البيانات ‪ PGA‬خاصة به تحتوى على معلومات خاصة به ‪.‬وهى تحتوى على‬
‫ثلثة أجزاء ‪-:‬‬
‫‪Private SQL Area -1‬‬
‫‪Session Memory -2‬‬
‫‪SQL Work Area -3‬‬

‫‪Background Processes 1.1.2‬‬

‫‪12‬‬
‫وقبل الحديث عن ال ‪ Background Processes‬ل بد من الذكر بأن هناك ثلثة‬
‫انواع من ال ‪-: Processes‬‬

‫‪ -: User process -1‬وهو يبدأ العمل عندما يطلب المستخدم التصال‬


‫بقواعد البيانات عن طريق احد ادوات قواعد البيانات ‪.‬‬
‫‪ -: Server Process -2‬ويتم انشاؤه لحظة التصال بال ‪ Instances‬بعد‬
‫ال ‪ User Process‬التصــال بقواعــد البيانــات فيتــم التحقــق مــن‬ ‫طلــب‬
‫المستخدم فلحظة التصال هى لحظة إنشاء ال ‪ Server Process‬وهو يكــون بيــن ال‬
‫‪ User Process‬وال ‪ ، Instance‬فلكــل ‪ User Process‬فــى قاعــدة البيانــات ‪Server‬‬
‫‪ Process‬خاص به هذا إذا كنا نعمل فى بيئة ال ‪ Dedicated Server‬أمــا إذا كنــا نعمــل‬
‫فى بيئة ال ‪ Shared Server‬فالمر يختلف قليل ً ‪ ،‬عموما ً سنناقش هذا المر لحقا ً ‪.‬‬
‫‪ - :Background Processes -3‬وهو موضوع نقاشنا فى هذه الفقرة وهى عبارة عن‬
‫معالجات تعمل فى قاعدة البيانات بحيث تقوم بمهام مختلفة تبدأ العمل لحظة فتــح‬
‫ال ‪ ، Instance‬وتنقسم الى قسمين‪-:‬‬

‫‪ :Mandatory -1‬ل بد من عملها لحظة فتح ال ‪. Instance‬‬


‫‪ : Optional -2‬وبدونها تستطيع ال ‪ Instance‬العمل وهذا النوع يعمل فى بعض‬
‫الحوال التى يتم فيه تهيئة قاعدة البيانات للعمل على خيارات معينة ‪.‬‬

‫‪13‬‬
:Mandatory Processes 1.1.2.1
-:‫ وهى‬، Processes ‫ول يمكن لقاعدة البيانات العمل دون هذه ال‬

: (System Monitor (SMON -1

14
‫وأقصى عدد لهذا ال ‪ Process‬فى قاعدة البيانات هو ‪ ، 1‬ويقوم بعمل‬
‫السترجاع )‪ (Recovery‬إذا حصل مشكلة فى ال ‪ ، Instance‬واذا كنا نعمل على‬
‫البيئة )‪ RAC) Real Application Clusters‬وهى عمل اكثر من ‪ Instance‬فى قاعدة‬
‫البيانات الواحدة فإن ال ‪ SMON‬فى ال ‪ Instance‬السليمة يستطيع عمل ‪Recovery‬‬
‫لل ‪ Instance‬الخرى التى حدث فيها مشكلة ‪.‬‬

‫كذلك يستطيع ال ‪ SMON‬عمل تنظيف لل ‪ Segments‬المؤقتة التى لم يتم‬


‫استخدامها من فترة طويلة ‪.‬‬

‫‪: (Process Monitor (PMON -2‬‬


‫وأقصى عدد لهذا ال ‪ Process‬فى قاعدة البيانات هو ‪ ، 1‬ويقوم بعمل‬
‫‪ Recovery‬لل ‪ Process‬إذا حصلت مشكلة فى ال ‪ ، User Process‬كذلك يقوم تنظيف‬
‫ال ‪ Database Buffer Cache‬لتاحة المصادر فى هذا الجزء من الذاكرة لل ‪، Process‬‬
‫وكذلك يقوم بتسجيل المعلومات حول ال ‪ Instance‬وال ‪، Dispatcher Processes‬‬
‫وايضا ً يقوم بعمل اختبار لل ‪ Dispatcher Processes‬وال ‪ Server Processes‬ويقوم‬
‫بعمل إعادة تشغيل فى حالة وجود مشكلة فيهم ‪.‬‬

‫‪: (Log Writer (LGWR -3‬‬


‫وأقصى عدد لهذا ال ‪ Process‬فى قاعدة البيانات هو ‪ ، 1‬ويقوم بعمل‬
‫كتابة للبيانات الموجودة فى ال ‪ Red Log Buffer‬ويكتبها فى ال ‪، Redo Log Files‬‬
‫ويقوم بهذه العملية فى الحوال التية ‪-:‬‬
‫‪ -1‬لحظة عمل ‪. Commit‬‬
‫كل ثلث ثوانى ‪.‬‬ ‫‪-2‬‬
‫‪ -3‬عندما يمتلئ ثلث ال ‪. Redo Log Buffer‬‬
‫ً‬
‫‪ -4‬لحظة عمل ‪، DBWn‬سنناقش هذا لحقا ‪.‬‬
‫كذلك اال ‪ LGWR‬يقوم بكتابة التزامن لل ‪ Redo Log Groups‬فإذا حدثت مشكلة‬
‫فى ‪ Redo log File‬فإن ال ‪ LGWR‬يقوم بإرسال خطأ لملف ‪. Alert Log‬‬
‫ملحظة ‪ :‬يجب النتباه إلى أنه لحظة عمل ‪ Commit‬فإن ال ‪ LGWR‬يقوم بكتابة‬
‫البيانات المثبتة وغيرها الموجودة فى ال ‪ Redo log Buffer‬إلى ال ‪. Redo Log File‬‬
‫نستفيد من عملية ال ‪ LGWR‬فى السترجاع إذا حصلت مشكلة فى ال ‪. Instance‬‬

‫‪:(Database Writer (DBWn -4‬‬


‫وأقصى عدد لهذا ال ‪ Process‬فى قاعدة البيانات هو ‪ ، 20‬ويقوم بكتابة البيانات‬
‫الموجودة فى ال ‪ Database Buffer Cache‬لل ‪ ، Datafiles‬ويمكن تهيئة قاعدة‬
‫البيانات لتعمل بأكثر من ‪ DBWn‬حسب الحاجة واقصلى عدد ‪. 20‬والمتغير الذي‬
‫يتحكم فى عدد هذا ال ‪ Process‬هو ‪. DB_WRITER_PROCESSES‬‬

‫ويعمل هذا ال ‪ Process‬بكتابة البيانات الموجودة فى ال ‪Database Buffer Cache‬‬


‫لل ‪ Datafiles‬فى الحالت التية ‪-:‬‬
‫ً‬
‫‪ -1‬لحظة حدوث ال ‪ Checkpoint‬وسنتحدث عن ذلك لحقا ‪.‬‬
‫‪ -2‬كل ثلث ثوانى ‪.‬‬

‫‪15‬‬
‫لحظة حدوث ال ‪ Log Switch‬وسنتحدث عنه لحقا ً ‪.‬‬ ‫‪-3‬‬
‫لحظة إغلق قاعدة البيانات ‪.‬‬ ‫‪-4‬‬
‫لحظة وصول ال ‪ Block‬للقيمة المحددة ‪.‬‬ ‫‪-5‬‬
‫لحظة إمتلء ال ‪. Buffer‬‬ ‫‪-6‬‬
‫عند عمل التى ‪-:‬‬ ‫‪-7‬‬
‫* ‪Tablespace Offline‬‬
‫* ‪Tablespace Read Only‬‬
‫* ‪Table Drop or Truncate‬‬
‫* ‪Tablespace Begin Backup‬‬

‫‪:CKPT) Checkpoint Process) -5‬‬

‫وأقصى عدد لهذا ال ‪ Process‬فى قاعدة البيانات هو ‪ ، 1‬ويقوم بالتأكد‬


‫من أن كل التعديلت التى تتم على البيانات فى ال ‪ Buffer‬تم كتابتها وتثبيتها فى ال‬
‫‪ Datafiles‬ومن ثم يقوم بعمل تزامن كامل لكل ال ‪ Datafiles‬ويقوم بعمل تعديل لل‬
‫‪ Datafiles headers‬؛ وال ‪ Control files‬يتم تعديله عند اخر ‪ ، SCN‬بحيث يتم تزامن‬
‫كامل لقاعدة البيانات ونضمن أنه يمكن استرجاع قاعدة البيانات فى حال حدوث‬
‫مشكلة ‪.‬‬
‫ويتم عمل ال ‪ CKPT‬فى الحالت التالية ‪-:‬‬
‫‪ -1‬لحظة حدوث ‪.Log Switch‬‬
‫‪ -2‬عند وصول الزمن المحدد فى المتغير ‪LOG_CHECKPOINT_TIMEOUT‬‬
‫‪ -3‬عند ما يصل عدد ال ‪ BLOCKS‬المحدد فى المتغير‬
‫‪LOG_CHECKPOINT_INTERVAL‬‬
‫‪ -4‬عند وصول عدد ال ‪ Buffer‬المحدد فى المتغير‬
‫‪. FAST_START_IO_TARGET‬‬
‫‪ -5‬عند تنفيذ الوامر التالية ‪-:‬‬
‫‪;SQL> ALTER SYSTEM SWITCH LOGFILE‬‬
‫‪;SQL> ALTER SYSTEM CHECKPOINT‬‬

‫‪16‬‬
‫‪: (Recover (RECO -6‬‬
‫وأقصى عدد لهذا ال ‪ Process‬فى قاعدة البيانات هو ‪ ، 1‬وستخدم‬
‫هذا ال ‪ Process‬لمعالجة مشكلة العمليات الموزعة المعلقة نتيجة مشكلة فى‬
‫الشبكة او النظام ‪ ،‬فبعد فترة محددة يقوم ال ‪ Process‬بمحاولة التصال عن بعد‬
‫ومحاولة اكمال العملية أو التراجع عنها ‪.‬‬

‫‪:Optional Processes 1.1.2.2‬‬


‫ويمكن لقاعدة البيانات العمل دون هذه ال ‪ Processes‬ولكثرة هذه ال ‪Processes‬‬
‫سنتطرق لهمها ‪-:‬‬
‫‪: (Archiver (ARCn -1‬‬
‫وأقصى عدد لهذا ال ‪ Process‬فى قاعدة البيانات هو ‪ ، 10‬ويقوم بكتابة‬
‫ال ‪ Online Red log Files‬فى ملف الرشيف )‪ (Archive Log Destination‬بعد‬
‫حدوث ال ‪ ، Log Switch‬هذا ال ‪ Process‬يعمل إذا كانت قاعدة البيانات تعمل فى‬
‫النمط ‪ , Archive Log Mode‬يتم التحكم فى عدد هذا ال ‪ Process‬عن طريق‬
‫المتغير ‪. LOG_ARCHIVE_MAX_PROCESSES‬‬

‫‪:(Recovery Writer(RVWR -2‬‬


‫هذا ال ‪ Process‬تم استحداثه فى الصدارة ‪ Oracle 10g‬نستفيد من هذا ال‬
‫‪ Process‬عند عملية ال ‪ ، Flashback Database‬سنناقش هذا الموضوع لحقا ً ‪.‬‬

‫‪.(Lock Monitor (LMON -3‬‬


‫‪. Lock Manager DAEMON -4‬‬
‫‪. LCKn) Lock Process) -5‬‬
‫‪. (Block Server Process (BSPn -6‬‬
‫‪. (Queue Monitor (QMNnَ-7‬‬
‫‪. (Event Monitor (EMNn -8‬‬
‫‪. (Shared Server Processes (Snnnٍ-9‬‬
‫‪. (Memory Manager (MMAN-10‬‬

‫‪17‬‬
‫‪.(Parallel Execution slaves (Pnnn-11‬‬
‫‪. (Trace Writer (TRWR -12‬‬
‫‪. DMON -13‬‬
‫‪. (Dispatcher (Dnnn -14‬‬
‫‪. MMON -15‬‬
‫‪. (Wakeup Monitor Process (WMON -16‬‬
‫‪. (Memory Monitor Light (MMON -17‬‬
‫‪. RBAL -18‬‬
‫‪. ARBx -19‬‬
‫‪. ASMB -20‬‬
‫‪. (Change Tracking Writer (CTWR -21‬‬
‫‪. (Job Queue Monitoring (CJQn -22‬‬

‫‪:Oracle Database 1.2‬‬

‫وهو الجزء الثانى من مكونات قاعدة البيانات اوركل كما ذكرنا‬


‫سابقا ً ‪-:‬‬
‫‪Oracle Database server = Oracle Instance + oracle Database‬‬
‫ويحتوى هذا الجزء من مجموعة من الملفات ‪-:‬‬
‫‪-: Control files -1‬‬
‫وهو الملف المسؤل عن التزامن فى قاعدة البيانات بجانب انه‬
‫يحتوى عن المعلومات الساسية عن قاعدة البيانات كإسم قاعدة البيانات وبدونه ل‬
‫تعمل قاعدة البيانات إذ أنه يحتوى على مسارات ملفات قاعدة البيانات وإذا تمت‬
‫إضافة ملف فى قاعدة البيانات يتم تحديث ال ‪ Control file‬اوتومتيكيا ً ‪.‬‬

‫‪-: Redo log files -2‬‬


‫ويستخدم هذا الملف حتى نستطيع عمل إسترجاع لقاعدة البيانات )‬
‫‪ (Recover‬فى حالة حدوث مشكلة فى قاعدة البيانات ‪ ،‬إذ أنه يحفظ التغيرات التى‬
‫تحدث فى قاعدة البيانات ‪.‬‬
‫يتم تحديد هذا الملف عند فتح قاعدة البيانات عن طريق ال ‪، Parameter file‬‬
‫ولحمايته من الفقدان يجب استخدام اكثر من نسخة من هذا الملف عن طريق‬
‫تحديد هذه النسخ فى ملف ال ‪. Parameter file‬‬

‫‪-: Database files -3‬‬


‫وهو المخزن الحقيقى للبيانات فى قاعدة البيانات أى أنه يحتوى على‬
‫الجداول والمناظير والمراجع )‪ ( Table & Views & Indexes‬والكائنات الخرى ‪.‬‬

‫‪-: Archived redo log files -4‬‬

‫‪18‬‬
‫وهو عبارة عن نسخة من ال ‪ Redo log files‬ونحتاجه أيضا ً عند عمل‬
‫إسترجاع لقاعدة البيانات )‪. (Recover‬‬

‫‪ -5‬الملفات الخرى‪-:‬‬
‫* ‪ Parameter file‬ويستخدم لعمل تهيئة لل ‪Oracle Instance‬‬
‫لحظة تشغيلها‬
‫* ‪Password file‬ويسمح هذا الملف للمستخدمين التصال‬
‫بقاعدة البيانات عن‬
‫بعد كمدراء لقاعدة البيانات ‪ ،‬وليس لتخزين كلمات السر للمستخدمين فى قاعدة‬
‫البيانات كما يتصور البعض ‪.‬‬
‫‪-:Tablespace and Data File‬‬

‫وهنا لبد من الحديث إلى انه يمكن تقسيم قاعدة البيانات الى )& ‪Physical‬‬
‫‪: (Logical‬‬

‫‪19‬‬
‫‪ :Physical‬حيث يمكن التعامل مع هذا النوع سواء كانت قاعدة البيانات مفتوحة‬
‫أو مغلقة بحيث يمكن التعامل مع هذا النوع عن طريق نظام التشغيل أو عن طريق‬
‫قاعدة البيانات‪.‬‬

‫‪ :Logical‬ول نستطيع التعامل مع هذا النوع إلى أذا كانت قاعدة البيانات‬
‫مفتوحة‪.‬‬

‫‪-:Tablespace and Data File‬‬

‫قاعدة البيانات فيزيائيا ً تتقسم إلى ملفات تخزينية يمكن أن تشاهد عن طريق نظام‬
‫التشغيل وهى ملفات ال ‪ ، Data files‬وكذلك قاعدة البيانات تنقسم إلى وحدات‬
‫تخزين منطقية )‪ (Logical‬وتسمى هذه الوحدات ‪. Tablespace‬‬

‫‪20‬‬
‫ال ‪ Tablespace‬وهو وحدة منطقية يحتوى على ‪ Data file‬واحد أو أكثر وكل ‪Data file‬‬
‫ينتمى فى الحقيقة إلى ‪ Tablespace‬واحد ‪.‬‬
‫يمكن إنشاء ‪ Bigfile Tablespaces‬بحيث يحتوى على ملف ‪ Data file‬واحد ولكن‬
‫كبير جدا ً بحيث يكون اكبر من ‪. 4GB‬‬
‫ال ‪ Tablespace‬يتكون من مجموعة من الوحدات المنطقية الصغر وهى تسمى‬
‫‪ Segments‬وهى وحدات منطقية يتكون منها ال ‪ Tablespace‬بحيث تنتمى ال‬
‫‪ Segment‬ل ‪ Tablespace‬واحد فقط وهى تتكون من مجموعة من الوحدات‬
‫المنطقية الصغر التى تسمى ‪ Extents‬وهى ايضا ً وحدات منطقية تنتمى كل ‪Extent‬‬
‫ل ‪ Segment‬واحد وتتكون أيضا ال ‪ Extents‬من مجموعة أخرى أصغر وهى أصغر‬
‫وحدة منطقية تسمى ال ‪. Blocks‬‬
‫وعند إنشاء قاعدة البيانات يتم تحديد حجم ال ‪ Block‬لقاعدة البيانات ‪ ،‬ويمكن أن‬
‫يكون حجم ال ‪ Block 3BK‬او ‪ 5BK‬أو غيره وأكبر حجم لل ‪ Block‬يتوقف على نظام‬
‫التشغيل ‪ ،‬وقبل الصدار ‪ Oracle 9i Release‬كانت قاعدة البيانات تعمل على حجم‬
‫واحد لل ‪ Block‬وابتداًء من الصدار ‪ Oracle 9i Release‬أمكن لقاعدة البيانات العمل‬
‫بأحجام مختلفة من الل ‪Block‬‬

‫ولنفترض السناريو التى ‪-:‬‬

‫‪21‬‬
‫فانفترض أن هذا الشكل يمثل ‪ Tablepace‬يسمى ‪ . Users‬هذا ال ‪ Tablespace‬يحتوى‬
‫على ملفين من ال ‪Data file ( (D1&D2‬هذا ال ‪ Tablespace‬يحتوى على مجموعة‬
‫من ال ‪ (Segments (T1&T2&T3‬ال ‪ Segment‬الول ‪ T1‬مقسم إلى مجموعة من ال‬
‫‪ Extents‬وكل ‪ Extent‬بالطبع مكون من مجموعة من ال ‪ ، Blocks‬نلحظ هنا أن ال‬
‫‪ Segment T1‬يمتد على كل من الملفين )‪ (D1&D2‬أى أن جزء من ال ‪ Segment‬فى‬
‫الملف ‪ D1‬والجزء الخر فى الملف ‪ D2‬لكن فى الوقت نفسه هو ينتمى ل‬
‫‪ Tablespace‬واحد ‪.‬‬

‫قبل نهاية هذا الباب فلنتابع معا ً هذا السناريو وهو يوضح خطوات عمل قاعدة‬
‫البيانات ‪:‬‬

‫‪22‬‬
‫ال ‪ Instance‬تعمل على المخدم )‪.(Server‬‬ ‫‪-1‬‬
‫فى هذه المرحلة المستخدم يحاول التصال بقاعدة البيانات عن‬ ‫‪-2‬‬
‫طريق ال ‪ Application‬أو أحد أدوات قواعد البيانات‪.‬‬
‫فى هذه اللحظة تم التحقق من طلب المستخدم وتم إنشاء التصال‬ ‫‪-3‬‬
‫وتكوين ‪.Server Process‬‬

‫‪23‬‬
‫هنا المستخدم طلب تعديل صف ‪.‬‬ ‫‪-4‬‬
‫ال ‪ Server Process‬يستقبل هذا الطلب ويقوم بعمل اختبار لل ‪Shared‬‬ ‫‪-5‬‬
‫‪ Pool‬هل هذا الطلب موجود فى ال ‪ Shared SQL Area‬إذا كان موجود يقوم‬
‫بالتأكد من أن للمستخدم صلحية الوصول لهذا البيانات ‪ ،‬اما إذا كان هذا‬
‫الطلب غير موجود يقوم بإنشاء ‪ Shared SQL Area‬جديد ‪.‬‬
‫فى هذه المرحلة يقوم ال ‪ Server Process‬بجلب البيانات المطلوبة‬ ‫‪-6‬‬
‫من ال ‪ Data file‬من الجدول أو من ال ‪ Data Block‬المخزنة فى ال ‪. SGA‬‬
‫بعد جلب البيانات هنا يقوم ال ‪ Server‬بتعديل الجدول فى ال ‪. SGA‬‬ ‫‪-7‬‬
‫لحظة عمل ‪ Commit‬يقوم ال ‪ LGWR‬بكتابة العملية فى ال ‪Redo Log‬‬ ‫‪-8‬‬
‫‪. File‬‬
‫يقوم ال ‪ DBWn‬بكتابة التعديلت فى ال ‪ Disk‬اى فى ال ‪. Data File‬‬ ‫‪-9‬‬
‫ً‬
‫‪ -10‬اخيرا يرسل ال ‪ Server Process‬يرسل رسالة بنجاح أو فشل العملية ‪.‬‬

‫‪24‬‬
25
‫النقاط الرئيسية التى سنناقشها فى هذا الباب ‪-:‬‬
‫• فهم الشروط الضرورية لنشاء قاعدة‬
‫البيانات ‪.‬‬
‫• إنشاء قاعدة بيانات بالطريقة اليدوية ‪.‬‬
‫• إنشاء قاعدة البيانات بالداة ‪. DBCA‬‬

‫‪26‬‬
‫من أهم مهام مدير قاعدة البيانات هو التخطيط لقاعدة البيانات ‪ ،‬إذ ل‬
‫يتصور مديرا ً ناجحا ً لقاعدة البيانات ل يخطط بصورةٍ ما لقاعدة بياناته ‪ ،‬فما نوع‬
‫البيانات التى سوف نخزنها فى كل ‪ Tablespace‬وكم ‪ Data file‬فى كل ‪Tablespace‬‬
‫وكيف سيتم تخزين ملفات قاعدة البيانات فيزيائيا ً على الديسك ‪ ،‬وكيف سيتم‬
‫عمل نسخ احتياطى لقاعدة البيانات ‪ ،‬وكيف نحافظ على قاعدة البيانات ‪ ،‬وكيف‬
‫نستطيع رفع الداءة فى قاعدة البيانات وغيرها من السئلة التى يجب ان تجد لها‬
‫جوابا ً ‪.‬‬
‫بعد ذلك يجب أن نحدد ما نحتاجه من الذاكرة والديسك المناسب حسب‬
‫متطلبات قاعدة البيانات وعموما يجب وضع هذه العتبارات عند إنشاء قاعدة‬
‫البيانات ‪.‬‬
‫فى الحقيقة يمكن إنشاء قاعدة البيانات أثناء إنزال الوركل عن طريق ال‬
‫‪ (OUI (Oracle Universal Installer‬وذلك بواسطة الداة ‪ DBCA‬ولكن قد نحتاج‬
‫لنشاء قاعدة بيانات أخرى ‪.،‬‬

‫عند إنشاء قاعدة بيانات اوركل يجب مراعاة النقاط التية‪-:‬‬


‫كم عدد ال ‪ Application‬التى تعمل على قاعدة البيانات ‪.‬‬ ‫‪-1‬‬
‫عدد المستخدمين إذ نحتاج وضع المتغير ‪ process‬فى ملف المتغيرات‬ ‫‪-2‬‬
‫)‪. (parameter file‬‬

‫‪27‬‬
‫مساحة الذاكرة ‪ SGA‬فهذه الذاكرة مطلوبة لعمل ال ‪ Instance‬وهى‬ ‫‪-3‬‬
‫ل تقبل المشاركة بين أكثر من ‪ Instance‬أى لكل ‪ Instance‬ذاكرة ‪ SGA‬خاصة‬
‫بها ‪.‬‬
‫كذلك ال ‪ Block_Size‬الذى يعتمد عليه ال ‪. Row_Size‬‬ ‫‪-4‬‬
‫هل يمكن إغلق قاعدة البيانات لعمل النسخ الحتياطى ‪.‬‬ ‫‪-5‬‬

‫‪ -1‬إنشاء قاعدة البيانات بالطريقة اليدوية )‪: (Manually‬‬

‫قبل البدء يجب الشارة إلى أننا سنستخدم نظام التشغيل ‪. windows‬‬

‫تحديد اسم ال ‪ -: (Instance (ORACLE_SID‬فقد يكون هناك أكثر من‬ ‫‪-1‬‬


‫‪ Oracle Instance‬فى الجهاز الواحد وذلك باستخدام المتغير ‪. ORACLE_SID‬‬
‫اسم ال ‪ Instance‬هنا ‪. OBAY‬‬

‫‪D:\ORACLE\PRODUCT\10.2.0>SET ORACLE_SID=OBAY‬‬

‫إنشاء ‪ Oracle Service‬وذلك لننا نعمل على نظام التشغيل‬ ‫‪-2‬‬


‫‪ WINDOWS‬إذ نحتاج لل ‪ Service‬لكل ‪ Instance‬تعمل فى نظام التشغيل‬
‫‪ WINDOWS‬ول يلزمنا ذلك فى نظام التشغيل ‪. LINUX‬‬
‫وهى بإختصار عبارة عن ‪ SERVICE‬يتم إنشاؤها فى ال ‪. WINDOWS‬‬

‫‪D:\ORACLE\PRODUCT\10.2.0\DB_1>ORADIM –NEW –SID‬‬


‫‪%ORACLE_SID% -INTPWD PASSWORD –STARTMODE M‬‬

‫‪28‬‬
‫ل‪. Services‬‬
‫يمكن التحقق من النشاء عن طريق نظام التشغيل بالذهاب الى ا ٍ‬

‫إنشاء ملف المتغيرات )‪ -: (Parameter File‬وذلك بنسخ الملف من‬ ‫‪-3‬‬


‫المسار التالى ‪:‬‬

‫‪D:\ORACLE\PRODUCT\10.2.0\db_1\database\copy‬‬
‫‪init.ora INITobay.ora‬‬
‫اما إذا كنا نعمل على نظام التشغيل لينكس )‪ (UNUX‬فإن المسار سيكون ‪:‬‬
‫‪$ORACLE_HOME/DB‬‬
‫نتابع الخطوات السابقة ‪:‬‬

‫بالطبع نحتاج لتعديل ملف المتغيرات حسب المعطيات الجديدة ‪ ،‬على سبيل المثال‬
‫‪-:‬‬

‫‪29‬‬
CONTROL_FILES =
(‘D:\oracle\product\10.1.0\oradata\OBAY\CONTROL01.
CTL,
D:\oracle\product\10.1.0\oradata\OBAY\CONTROL02.CT
L,
D:\oracle\product\10.1.0\oradata\OBAY\CONTROL03.CT
L)
UNDO_MANAGEMENT = AUTO
undo_tablespace = ‘UNDO'
DB_NAME = OBAY
DB_BLOCK_SIZE = 8192
background_dump_dest =
'D:\oracle\product\10.1.0\admin\obay\bdump’
user_dump_dest =
'D:\oracle\product\10.1.0\admin\obay\udump'
core_dump_dest =
'D:\oracle\product\10.1.0\admin\obay\cdump'

NOMOUNT ‫ فى الوضع‬Instance ‫ تشغيل ال‬-4

30
‫ الن نقوم بإنشاء قاعدة البيانات‬-5

create database obay


Logfile
group 1
('D:\oracle\product\10.1.0\oradata\OBAY\redo1.log')
size 10m,
group 2
('D:\oracle\product\10.1.0\oradata\OBAY\redo2.log')
size 10m,
group 3
('D:\oracle\product\10.1.0\oradata\OBAY\redo3.log')
size 10m
datafile
'd:\obay\system.dbf' size 50m
AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED
extent management local
sysaux datafile
'D:\oracle\product\10.1.0\oradata\OBAY\sysaux.dbf'
size 10m
AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED
undo tablespace undo
datafile
'D:\oracle\product\10.1.0\oradata\OBAY\undo.dbf'
size 20m
default temporary tablespace temp tempfile
'D:\oracle\product\10.1.0\oradata\OBAY\temp.dbf'
size 20m
default tablespace userdata1 datafile
'D:\oracle\product\10.1.0\oradata\OBAY\userdb.dbf'
size 10m ;

31
‫كما ذكرت سابقا ً أنت تستطيع إنشاء قاعدة البيانات حسب متطلباتك‬
‫الخاصة وليست فقط كما هو مذكور فى النموزج أعله ‪ ,‬لكن لبد من إنشاء )‬
‫‪. ( SYSTEM & SYSAUX TABLESPACE‬‬
‫إذا حدث خطأ اثناء إنشاء قاعدة البيانات فإن الخطأ سيكتب فى الملف ‪Alert Log‬‬
‫الموجود فى المسار المحدد فى ملف المتغيرات بالمتغير ال‬
‫‪. BACKGROUND_DUMP_DEST‬‬

‫أما إذا ظهرت الرسالة ‪ ORA-01031‬اثناء إنشاء قاعدة البيانات فهذا يعنى ان‬
‫مستخدم نظام التشغيل ليس عضوا ً فى المجموعة ‪ ORA_DBA‬فيجب إضافته فى‬
‫المجموعة ‪.‬‬

‫بعد إنشاء قاعدة البيانات يمكن تشغيلها فى الوضع ‪ MOUNT‬او فتحها للستخدام ‪.‬‬

‫‪ -6‬إنشاء ال ‪ -: Data Dictionary‬وذلك من خلل تشغيل الملف فى المسار التالى‬


‫‪-:‬‬

‫‪D:\ORACLE\PRODUCT\10.1.0\DB_1\RDBMS\ADMIN\CATALOG‬‬
‫‪.SQL‬‬

‫‪32‬‬
‫ولكن يجب تشغيل الملف على المستخدم ‪. SYS‬‬

‫كذلك نشغل الملف على المسار التالى ‪-:‬‬

‫‪D:\ORACLE\PRODUCT\10.1.0\DB_1\RDBMS\ADMIN\CATPROC‬‬
‫‪.SQL‬‬

‫وذلك لنشاء كل ال ‪ Structures‬المطلوبة لعمل ‪. PL/SQL‬‬

‫ل يختلف المر كثيرا ً عند إستخدام نظام التشغيل )‪(UNIX‬‬

‫‪ -2‬إنشاء قاعدة البيانات عن طريق ال)‪: (DBCA‬‬


‫وهى أداة اصدرتها اوركل لعدة اغراض ‪-:‬‬
‫إنشاء قاعدة البيانات ‪.‬‬ ‫‪-1‬‬
‫إعادة تهيثة قاعدة البيانات ‪.‬‬ ‫‪-2‬‬

‫‪33‬‬
‫حذف قاعدة البيانات ‪.‬‬ ‫‪-3‬‬
‫إنشاء قوالب لقاعدة البيانات )‪. (Templates‬‬ ‫‪-4‬‬

‫نتابع خطوات إنشاء قاعدة بيانات اوركل عن طريق الداة‬


‫‪(DATABASE CONFIGURATION ASSISTANT (DBCA‬‬

‫هنا الخيارات المتاحة للمستخدم ‪ ،‬سنختار بالطبع الخيار الول إنشاء قاعدة‬
‫بيانات ‪.‬‬
‫إذا اخترت الخيار الثانى سيعرض لى قواعد البيانات الموجودة عندى ومن ثم اختار‬
‫قاعدة البيانات المراد إعادة تهيئتها ‪ ،‬وبعد ذلك سيعرض لى بعض الخيارات لعادة‬
‫تهيئتها ‪.‬‬

‫‪34‬‬
‫الخيار الثالث بالطبع استطيع من خلله خذف قاعدة البيانات ‪ ،‬فقط ما على إل أن‬
‫اختار قاعدة البيانات المراد حزفها ‪.‬‬
‫الخيار الخير هو إما لنشاء قالب جديد وهو القالب الذى ستكون عليه قاعدة‬
‫البيانات )‪ (Template‬أو حذف قالب موجود ‪.‬‬

‫فى هذه الخطوة نختار القالب )‪ (Template‬الذى يتناسب مع مع متطلباتنا إذا لم‬
‫يوجد نستطيع إنشاء قالب بالخيار الرابع )‪. (Manage Template‬‬
‫ولنفترض أننا اخترنا القالب ‪. General Purpose‬‬

‫‪35‬‬
‫نختار هنا اسم قاعدة البيانات واسم ال ‪ (Instance (SID‬وليس بالضرورى أن يكون‬
‫نفس السم ‪.‬‬

‫هنا بعض الخيارات كعمل نسخ احتياطى كل فترة معينة او تشغيل اليميل للرسال‬
‫والستقبال ‪.‬‬

‫يمكن عمل كلمة سر واحدة لكل المستخدمين كما فى الخيار الول ويمكن تحديد‬
‫كلمة سر لكل مستخدم كما فى الخيار الثانى ‪.‬‬

‫‪36‬‬
‫هنا نحدد طريقة تخزين الملفات ‪،‬وقد اخترنا الطريقة الولى وهى ادارة الملفات‬
‫عن طريق نظام التشغيل‪.‬‬
‫ً‬
‫الطريقة الثانى هى طريقة تخزين وإدارة الية ولها ميزات سنتعرف عليها لحقا ‪.‬‬

‫نختار هنا مكان تخزين ملفات قاعدة البيانات ‪ .‬ولنفترض هنا الخيار الول وهو يعنى‬
‫التخزين حسب ما هو محدد فى القالب الذى اخترناه والذى كان ‪General‬‬
‫‪. Purpose‬‬

‫‪37‬‬
‫يمكن فى هذه الخطوة أن نحدد ‪ Flash Recovery Area‬وهى مكان لتخزين وإدارة‬

‫عمليات النسخ الحتياطى والسترجاع وسنتحدث عنها لحقا ُ ‪ ,‬كما يمكن تشغيل‬
‫الرشيف كما سنعرف لحقا ً ‪.‬‬
‫كما يمكن مشاهدة بعض المتغيرات والمعلومات عن قاعدة البيانات بالذهاب ال‬
‫‪. File Location Variables‬‬

‫هنا يمكن إنشاء نموزج لل ‪ Schema‬للتدريب ‪.‬‬

‫‪38‬‬
‫فى هذه الشاشة يمكن أن نغير فى حجم الذاكرة ونحدد حجم ال ‪ Block‬لقاعدة‬
‫البيانات وغيرها من المتغيرات الموجودة فى ملف المتغيرات ‪.‬‬

‫هنا يمكن مشاهدة اماكن تخزين ملفات قاعدة البيانات ‪.‬‬

‫‪39‬‬
‫نختار هنا الخيار الول لنشاء قاعدة البيانات ‪ ،‬كما يمكن حفظ خطوات انشاء‬
‫قاعدة البيانات كقالب وذلك باختيار الخيار الثانى ‪.‬‬
‫عند الضغط على الخيار ‪ Finish‬تظهر الصفحة التالية ‪-:‬‬

‫‪40‬‬
‫وهى عبار عن تفاصيل ومعلومات عن قاعدة البينات التى نريد إنشاءها بالطبع‬
‫يمكن حفظها بالضغط على الخيار حفظ ‪.‬‬

‫انتظر قليل ً حتى ينتهى أنشاء قاعدة البيانات ‪.‬‬

‫‪41‬‬
42
‫فى الباب السابق قمنا بإنشاء قاعدة البيانات وسنناقش فى هذا الفصل‬
‫كيفية التحكم فى قاعدة البيانات ‪ ،‬وهو امر مهم لمدير قاعدة البيانات ‪.‬‬
‫تخيل أنك مدير لقاعدة بيانات عملقة ‪ ،‬يتتطلب منك المرأن تكون هذه‬
‫القاعدة متاحة للجميع حتى زمن محدد بعد هذا الوقت تكون متاحة لعدد معين‬
‫للمستخدمين ‪ ،‬هذا العدد من المستخدمين بعد زمن اخر يستطيع فقط القراءة أى‬
‫ل يستطيع الكتابة والتعديل ول المسح ‪.‬‬
‫ً‬ ‫ً‬
‫هل تخيلت معى العمل الذى ينتظرك ؛ بالطبع عمل ً كبيرا لكن ليس صعبا إذا‬
‫عرفت ماذا تريد أن تفعل بالضبط ‪.‬‬
‫والن اول ما يجب أن تعرفه أنك تستطيع أن تتحكم فى قاعدة البيانات إذا كانت‬
‫تعمل فى نظام التشغيل ويندوز عن طريق ال ‪ Services‬وهناك عدة خيارات أول ً‬

‫‪43‬‬
‫‪ STOP‬ليقاف العمل وكذلك ‪ START‬للتشغيل وايضا ً ‪ RESTART‬لعادة التشغيل‬
‫وكذلك هنا خيارات اخرى مثل ً )& ‪.Manual Disabled & (Automatic‬‬
‫ً‬
‫‪ :Automatic‬والمعنى أنه لحظة تشغيل نظام التشغيل تعمل ال ‪ Services‬اليا إذا‬
‫كانت فى الخيار ‪.START‬‬
‫‪ :Manual‬وهى أن تقوم بعمل تشغيل يدوى لل ‪ Services‬بعد تشغيل نظام التشغيل‪.‬‬
‫‪ :Disabled‬والمعنى إيقاف عمل ال ‪ Services‬مهما كان حالتها‪.‬‬

‫ملف المتغيرات )‪:(Initialization Parameter File‬‬


‫وهذا الملف شأنه عجيب إذ ل تعمل قاعدة البيانات دون هذا الملف لذا كان‬
‫لزاما ً أن نتحدث عنه فى هذا الفصل فهو اول ملف تحتاجه قاعدة البيانات عند‬
‫تشغيلها ‪ ،‬فهو يحتوى على إسم قاعدة البيانات وكذلك اسم ومكان ال ‪Control‬‬
‫‪ Files‬وايضا ً عن طريقه تتهيأ الذاكرة )‪. (SGA‬‬
‫فلحظة تشغيل قاعدة البيانات يتم قراءة هذا الملف فيتم تكوين الذاكرة‬
‫ويتم معرفة اسم ومكان ملف ال ‪.Control Files‬‬
‫وهذا الملف قد يكون ‪-:‬‬
‫‪ :(Static Parameter File (PFILE‬ويكون اسمه )‬ ‫‪.1‬‬
‫‪ ، (initSID.ora‬حيث ال ‪ SID‬هو اسم ال ‪.Instance‬‬
‫وهو ملفى نصى نستطيع أن نجرى عليه‬
‫نحتاجها ثم نحفظه وذلك‬ ‫التغيرات التى‬
‫عن طريق نظام التشغيل ‪ ،‬ولكى يحدث‬

‫‪44‬‬
‫التاثير فى‬
‫قاعدة البيانات لبد من إغلقها وفتحها من‬
‫جديد ‪.‬‬
‫وهذا نموزج لملف ‪: PFILE‬‬

‫يكو ن اسمه‬ ‫‪:(Persistent Parameter File (SPFILE‬‬ ‫‪.2‬‬


‫‪ ، spfileSID.ora‬حيث ال ‪ SID‬هو اسم ال ‪ ، Instance‬وهو ملف ثنائى ل‬
‫نستطيع التغيير فيه إلى عن طريق الوركل بواسطة المر ‪-:‬‬

‫‪ALTER SYSTEM SET %PARAMETER%=VALUE‬‬

‫;‪ALTER SYSTEM SET undo_tablespace = UNDO‬‬

‫وقد ل نحتاج لعادة تشغي قاعدة البيانات حتى تحدث التأثيرات وذلك حسب‬
‫العامل ‪. SCOPE‬‬

‫= ‪ALTER SYSTEM SET parameter = value [SCOPE‬‬


‫]‪MEMORY|SPFILE|BOTH‬‬

‫‪45‬‬
‫وقد يأخذ العامل ‪SCOPE‬احدى ثلث قيم ‪-:‬‬
‫‪ :MEMORY -1‬وهى تعنى أن التغييرات تحدث فقط فى ال‬
‫‪ Instance‬التى تعمل الن فأول إعاد ة تشغيل لقاعدة البيانات نفقد‬
‫التغييرات‪.‬‬
‫‪ :SPFILE -2‬التغييرات هنا تحدث فى الملف ويحدث التاثير عند‬
‫إعادة تشغيل قاعدة البيانات‪.‬‬
‫‪ :BOTH -3‬التغييرات هنا تحدث فى ال ‪ Instance‬الحالية كما تحدث‬
‫أيضا فى الملف ‪ SPFILE‬اى أن التغييرات تظل باقية عند إعادة‬
‫تشغيل قاعدة البيانات‪.‬‬
‫والصل ان التغيرات تحدث فى كل من ال ‪ Instance‬الحالية وال ‪ SPFILE‬اى )‬
‫‪ (BOTH‬ولكن يعتمد التغيير ايضا ً على المتغير فبعض المتغيرات ل يمكن تعديلها إل‬
‫بوسطة الخيار ‪ ، SPIFLE‬اى ل يمكن تغييرها إل بعد إغلق قاعدة البيانات‪.‬‬

‫يمكن إنشاء ملف ال ‪ SPFILE‬من الملف ‪ PFILE‬ولكن يجب أن يملك المستخدم‬


‫الصلحية ‪.SYSDBA‬‬

‫;‪CREATE SPFILE FROM PFILE‬‬

‫كما يمكن إنشاء ملف ال ‪ PFILE‬من الملف ‪.SPFILE‬‬

‫تشغيل قاعدة البيانات )‪:(Starting Up Database‬‬

‫لتشغيل قاعدة البيانات يلزمك تحديد الحالة التى تريد أن تعمل بها قاعدة‬
‫بياناتك ‪-:‬‬
‫‪.NOMOUNT -1‬‬
‫‪.MOUNT -2‬‬
‫‪.OPEN -3‬‬

‫‪46‬‬
‫‪S‬‬
‫‪:NOMOUNT‬‬
‫نشغل ال ‪ Instance‬فى هذه الحالة إذا أردنا أن نقوم بإنشاء قاعدة بيانات أو‬
‫لعادة إنشاء ملف ال ‪ ، Control Files‬وعند تشغيل ال ‪ Instance‬فى هذه الحالة‬
‫تحدث الخطوات التالية ‪-:‬‬
‫‪ -1‬قراءة ملف المتغيرات وذلك حسب الترتيب التالى ‪-:‬‬
‫* اول ً ‪.spfileSID.ora‬‬
‫* اذا لم يجده بيحث عن ‪.spfile.ora‬‬
‫* إذا لم يجده يبحث عن ‪.initSID.ora‬‬
‫‪ - 2‬تكوين ال ‪.SGA‬‬
‫‪ - 3‬تشغيل ال ‪.background processes‬‬
‫‪ - 4‬فتح ملف ال ‪ alertSID.log‬وملف ال ‪. trace files‬‬

‫‪STARTU‬‬
‫‪:MOUNT‬‬

‫‪47‬‬
‫تشغل ال ‪ Instance‬فى هذه الحالة عند إجراء بعض العمليات على‬
‫قاعدة البيانات كتغيير اسم ال ‪ Data files‬أو انجاز استرجاع كلى لقاعدة البيانات‬
‫او تشغيل قاعدة البيانات فى ب عض الوضاع كوضع الرشيف مثل ُ ‪ ،‬وعند تشغيل‬
‫ال ‪ Instance‬فى هذه الحالة تحدث الخطوات التالية ‪-:‬‬
‫الوصول الى ملف ال ‪ Control files‬وفتحه بعدما تم تحديده بواسطة‬ ‫‪-1‬‬
‫ملف المتغيرات ‪.‬‬
‫قراءة ملف ال ‪ Control files‬لتحديد ملفات ال ‪ Data Files‬ومعرفة‬ ‫‪-2‬‬
‫حالتها وكذلك لتحديد ملفات ال ‪. Redo log Files‬‬

‫‪:OPEN‬‬
‫هذا هو الوضع الصلى عند تشغيل قاعدة البيانات بحيث تكون ال ‪Instance‬‬
‫مفتوحة وقاعدة البيانات متاحة بحيث يستطيع المستخدمين التصال بقاعدة‬
‫البيانات وتنفيذ عملياتهم ‪.‬‬
‫واثناء التشغيل فى هذه الحالة تحدث الخطوات التالية ‪-:‬‬
‫فتح ملفات ال ‪.Online Data Files‬‬ ‫‪-1‬‬
‫فتح ملفات ال ‪.Online Redo Log Files‬‬ ‫‪-2‬‬

‫أو‬

‫‪48‬‬
‫هكذا تكون قاعدة البيانات متاحة للمستخدمين ‪ ،‬وإذا كانت قاعدة البيانات‬
‫مفتوحة مثل ً فى الوضع ‪ NOMOUNT OR MOUNT‬وأردت أن تفتحها فى الوضع‬
‫‪ OPEN‬يلزمك استخدام المر ‪.ALTER‬‬

‫إغلق قاعدة البيانات )‪:(Shutting Down The Database‬‬


‫عند إغلق قاعدة البيانات يجب أن تملك الصلحية ‪SYSDBA OR SYSOPER‬‬
‫وهناك عدة اوضاع لغلق قاعدة البيانات ‪-:‬‬

‫‪49‬‬
‫‪.NORMAL‬‬ ‫‪-1‬‬
‫‪.TRANSACTIONAL‬‬ ‫‪-2‬‬
‫‪.IMMEDIATE‬‬ ‫‪-3‬‬
‫‪.ABORT‬‬ ‫‪-4‬‬

‫‪:NORMAL -1‬‬

‫وهو الوضع الصلى لغلق قاعدة البيانات واثناء الغلق تحدث الخطوات‬
‫التالية ‪-:‬‬
‫• ل يسمح بإتصال مستخدم جديد بقاعدة البيانات ‪.‬‬
‫• ‪ Oracle Server‬ينتظر كل المستخدمين من انهاء‬
‫اتصالهم قبل اكمال إغلق قاعدة البيانات‪.‬‬
‫• كل البيانات الموجود فى ال ‪ Buffer‬يجب أن تكتب فى‬
‫الديسك‪.‬‬
‫• إنهاء ال ‪ Background Processes‬وكذلك إالغاء ال‬
‫‪SGA‬من الذاكرة‪.‬‬
‫• إغلق قاعدة البيانات‪.‬‬
‫يتم إغلق ملفات قاعدة البيانات‬ ‫•‬
‫قبل أغلق ال ‪.Instance‬‬
‫• ل تحتاج لعملية إسترجاع لل ‪Instance‬عند فتح قاعدة‬
‫البيانات من جديد‪.‬‬

‫‪50‬‬
‫‪: TRANSACTIONAL -2‬‬
‫فى هذا الوضع من الغلق تحدث الخطوات التالية ‪-:‬‬
‫• كل المستخدمين ل يستطيعون بدء عمليات جديدة ‪.‬‬
‫• عند إنتهاء المستخدم من العملية )‪ (Transaction‬الحالية‬
‫يتم قطع إتصاله بقاعدة البيانات‪.‬‬
‫• لحظة إنتهاء كل العمليات )‪ (Transactions‬فى قاعدة‬
‫البيانات يتم إغلق قاعدة البيانات ‪.‬‬
‫ل تحتاج لعملية إسترجاع لل ‪Instance‬عند فتح‬ ‫•‬
‫قاعدة البيانات من جديد‪.‬‬

‫‪:IMMEDIATE‬‬ ‫‪-3‬‬
‫فى هذا الوضع من الغلق تحدث الخطوات التالية ‪-:‬‬
‫• العمليات الحالية فى قاعدة البيانات يتم قطعها مباشرةً‬
‫‪.‬‬
‫• ‪ Oracle Server‬ل ينتظر المستخدميين الحاليين فى‬
‫قاعدة البيانات حتى ينهوا إتصالهم‪.‬‬
‫• ‪ Oracle Server‬يقوم بعمل تراجع للعمليات النشطة‬
‫حاليا ً فلى ال ‪.Instance‬‬
‫• يتم إغلق ملفات قاعدة البيانات قبل أغلق ال‬
‫‪.Instance‬‬
‫• ل تحتاج لعملية إسترجاع لل ‪Instance‬عند فتح قاعدة‬
‫البيانات من جديد ‪.‬‬

‫‪:ABORT -4‬‬

‫‪51‬‬
‫فى هذا الوضع من الغلق تحدث الخطوات التالية ‪-:‬‬
‫• العمليات الحالية فى قاعدة البيانات يتم قطعها مباشرةً‬
‫‪.‬‬
‫• ل ينتظر المستخدميين الحاليين فى قاعدة البيانات‬
‫حتى ينهوا إتصالهم‪.‬‬
‫• البيانات الموجودة فى ال ‪ Buffer‬ل تكتب فى الديسك‪.‬‬
‫• العمليات التى لم يتم تثبيتها ل يتم التراجع عنها ‪.‬‬
‫• يتم إنهاء ال ‪ Instance‬دون إغلق ملفات قاعدة البيانات‪.‬‬
‫• عند فتح قاعدة البيانات من جديد نحتاج لعمل إسترجاع‬
‫لل ‪.Instance‬‬

‫‪Opening a Database in Read-Only Mode:‬‬

‫يمكن فتح قاعدة البيانات فى الوضع ‪ Read Only‬وذلك لعدم اجراء أى تعديلت على‬
‫قاعدة اليبانات ‪.‬‬
‫اثناء فتح قاعدة البيانات فى الوضع ‪ Read Only‬يمكن القيام ببعض المهام ‪-:‬‬
‫تنفيذ إستعلم ‪.‬‬ ‫‪-1‬‬
‫وضع ملفات ال ‪ Data Files‬فى الوضع ‪. and online offline‬‬ ‫‪-2‬‬
‫إنجاز إسترجاع لملفات ‪.offline data file and tablespace‬‬ ‫‪-3‬‬

‫‪52‬‬
‫‪Opening a Database in Restricted Mode:‬‬
‫فى هذا الوضع يمنع دخول المستخدمين لقاعدة البيانات إل إذا كان‬
‫‪RESTRICTED SESSION PRIVILEGE.‬‬ ‫المستخدم يملك صلحية‬

‫فى الحقيقة هذا الوضع مفيد فى البعض الحيان مثل ً اثناء قيامك بعمل تصدير‬
‫‪ Export‬لقاعدة البيانات ول تريد من المستخدمين من الدخول لقاعدة البيانات ‪.‬‬

‫او‬

‫الن كل المستخدمين الذين ل يملكون صلحية ال ‪RESTRICTED SESSION‬‬

‫‪ PRIVILEGE‬ل يستطيعون دخول قاعدة البيانات ‪.‬‬

‫الن يمكن إنهاء كل اتصالت المستخدمين الذين اتصلوا قبل تطبيق النمط‬
‫‪ RESTRICTED SESSION‬وذلك على خطوتين ‪-:‬‬

‫‪53‬‬
‫تحديد ال ‪ SESSION‬التى نريد إلغاءها وذلك عن طريق الستعلم‬ ‫‪-1‬‬
‫التى ‪:‬‬

‫‪SELECT SID, SERIAL# FROM V$SESSION‬‬

‫إلغاء ال ‪.SESSION‬‬ ‫‪-2‬‬

‫‪54‬‬
55
‫تحدثنا سابقا ً ان التخزين فى قاعدة البيانات يكون على حالتين الول‬
‫التخزين المنطقى ‪ Logical‬فى ال ‪ Tablespaces‬والثانى ‪ Physical‬فى ال ‪Data‬‬
‫‪. Files‬‬

‫وذكرنا كذلك أن اى ‪ Data Files‬يكون فى قاعدة البيانات هو فى الحقيقة‬


‫ينتمى ل ‪ Tablespace‬واحد ‪.‬‬

‫بمعنى اخر أنه ل يوجد ‪ Data Files‬فى قاعدة البيانات ل ينتمى ل‬


‫‪. Tablespace‬‬

‫وعموما ً فى هذا الفصل سنتحدث عن ‪-:‬‬


‫مفاهيم عامة عن ال ‪.Tablespaces‬‬ ‫‪-1‬‬
‫إنشاء ال ‪.Tablespaces‬‬ ‫‪-2‬‬
‫إدارة ال ‪.Tablespaces‬‬ ‫‪-3‬‬
‫كيفية الحصول على معلومات عن ال ‪.Tablespaces‬‬ ‫‪-4‬‬

‫‪56‬‬
57
‫مفاهيم عامة عن ال ‪:Tablespaces‬‬ ‫‪-1‬‬

‫‪58‬‬
‫الشكل اعله يوضح الخيارات المتاحة لل ‪ Tablespaces‬وهى ‪:‬‬
‫‪ :Space Management in Tablespaces - 1‬وهى كيفية إدارة‬
‫المساحة فى ال‪ Tablespaces‬وهناك نوعان‪-:‬‬
‫‪.Locally Managed Tablespaces -1‬‬
‫هنا يتم إدارة ال‪ Extents‬فى ال‪ Tablespace‬عن طريق ال‪Tablespace‬‬
‫ال ‪ ،Bitmaps‬فلحظة تخصيص ال‪ Extents‬أو تحريرها يقوم ال‪Oracle‬‬ ‫بواسطة‬
‫‪ Server‬بتغير قيمة ال‪ Bitmap‬للحالة الجديدة ‪ .‬وهذا النوع من الدارة هو الصل‬
‫ال‪ Tablespace‬فى الصدار ‪ ، Oracle 10g‬وقد صار هذا‬ ‫عند إنشاء‬
‫النوع متاح إبتداء من الصدار ‪ , Oracle 8i‬ولنه ل يحدث تعديل فى ال‪Dictionary‬‬
‫‪ Data‬فإنه ل يتم ‪.Generate Undo Information‬‬
‫لتحويل إدارة ال‪ Tablespace‬من ال ‪Data Dictionary‬الى ‪Locally‬‬
‫نستخدم‬
‫‪DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_TO_LOCAL‬‬

‫فى هذا النوع من إدارة ال‪ Tablespace‬هناك نوعان لدارة ال‪:Extents‬‬


‫‪ :Automatic -1‬هنا ل نحدد حجم ال‪ Extent‬إنما يتم تحديده عن‬
‫عن طريق النظام ‪ ،‬ول يمكن تطبيق هذا النوع‬
‫)‪.(Temporary Tablespace‬‬ ‫فى‬
‫‪ :Uniform -2‬هنا يمكن تحديد حجم ال‪ Extent‬فى ال‬
‫والصل حجم ال‪ extent‬هو ‪ .IMB‬ل يمكن تطبيق‬ ‫‪Tablespace‬‬
‫‪.Undo Tablespace‬‬ ‫هذا النوع فى‬

‫وكذلك فى هذا النوع من إدارة ال‪ Tablespace‬هناك نوعان لدارة ال‬


‫‪:Segement‬‬
‫‪.Automatic -1‬‬
‫‪.Manual -2‬‬

‫‪Dictionary- Managed Tablespaces: -2‬‬


‫هنا يتم إدارة ال‪ Extents‬فى ال‪ Tablespace‬عن طريق ال‪Data‬‬
‫‪Dictionary‬‬
‫فلحظة تخصيص ال ‪ Extents‬أو تحريرها يقوم ال ‪Oracle Server‬‬
‫بتغير ال ‪. Data Dictionary Tables‬‬

‫‪:Logging‬‬ ‫‪-2‬‬
‫‪ :Yes -1‬المعنى لحظة تغير الكائنات فى ال ‪ Tablespaces‬فانه يتم‬
‫كتابة التغييرات فى ال ‪.Redo Log Files‬‬
‫‪ :NO -2‬المعنى لحظة تغير الكائنات فى ال ‪ Tablespaces‬فانه ل‬
‫يتم كتابة كل التغييرات فى ال ‪.Redo Log Files‬‬

‫‪:Mode -3‬‬

‫‪59‬‬
‫‪ :Read Only -1‬المعنى هنا أننا ل نستطيع الكتابة أو التعديل أو المسح‬
‫على البيانات الموجودة فى ال ‪ ، Tablespace‬بالطبع ل نستطيع أن نضع كل من‬
‫ال)‪System & Sysaux‬‬
‫‪ ( Tablspace‬فى الوضع ‪.Read Only‬‬
‫‪ :Read and write -2‬المعنى أننا نستطيع الكتابة أو التعديل أو المسح‬
‫الموجودة فى ال ‪.Tablespace‬‬ ‫على البيانات‬

‫‪:Views -4‬‬
‫وهى الستعلمات لمعرفة معلومات عن ال ‪ Tablespaces‬وال ‪Data‬‬
‫‪..Files‬‬
‫‪DBA_TABLESPACES‬‬
‫‪V$TABLESPACE‬‬
‫‪DBA_DATA_FILES‬‬
‫‪V$DATAFILE‬‬
‫‪DBA_TEMP_FILES‬‬
‫‪V$TEMPFILE‬‬

‫‪:Contains -5‬‬
‫‪ : Permanent -1‬وهو لتخزين الكائنات المستديمة فى قاعدة البيانات ‪.‬‬
‫‪ :Temporary -2‬لتخزين الكائنات المؤقتة فى قاعدة البيانات لذلك تحتاج‬
‫مثل ً لعمليات ترتيب البيانات‪.‬‬ ‫قاعدة البيانات ‪،‬‬
‫‪ :Undo -3‬تستخدمه ال ‪ Database Server‬لتخزين ال ‪Undo Information‬‬
‫وهو ضرورى فى قاعدة البيانات ويتم إنشاءه أثناء إنشاء قاعدة البيانات ويمكن‬
‫اضافة اخرى عندما نحتاج لذلك لكن فى الوقت الواحد يعمل ‪ Undo‬واحد فقط‬
‫‪.%Undo_Tablespace=%Value‬‬ ‫يحدد عن طريق ملف المتغيرات‬
‫‪.‬‬
‫‪.‬‬
‫‪:Status -6‬‬
‫‪ :Online -1‬أى أن ال ‪ Tablespace‬متاح لجميع المستخدمين ‪.‬‬
‫‪ :Offline -2‬اى أن ال ‪ Tablespace‬غير متاح للمستخدمين وهناك عدة‬
‫خيارات لهذا الوضع‬
‫)‪ . ( Normal & Temporary & Immediate & For Recover‬ل يمكن وضع‬
‫)‪ (System & Undo Tablespace‬فى الوضع ‪.Offline‬‬

‫‪:SQL‬‬ ‫‪-7‬‬
‫‪ :Create -1‬لنشاء ال ‪.Tablespace‬‬
‫‪ :Alter -2‬لجراء تغيرات على ال ‪.Tablespace‬‬
‫‪ :Drop -3‬لحذف ال ‪.Tablespace‬‬

‫‪:Type -8‬‬

‫‪60‬‬
‫‪ :Small Tablespace -1‬وهو ‪ Tablespace‬يحتوى على ‪ Data File‬واحد أو أكثر‬
‫عند إنشاء ‪.Tablespace‬‬ ‫وهو الصل‬
‫‪ :Big Tablespace -2‬وهو نوع جديد من ال ‪ Tablespace‬صار متاح فى‬
‫‪ ، Oracle 10g‬بحيث تصل مساحته الى ‪(Terabytes(TB 128‬‬ ‫الصدار‬
‫واحد فقط ‪.‬‬ ‫ويحتوى على ملف ‪data File‬‬

‫تعريف عن بعض ال ‪:Tablespace‬‬

‫‪:System Tablespace -1‬‬


‫هو أهم ‪ Tablespace‬فى قاعدة البيانات على الطلق إذ ل‬
‫تعمل قاعدة البيانات بدونه كذلك ل نستطيع تغير حالته إلى الوضع )& ‪Read only‬‬
‫‪. ( Offline‬‬
‫يستخدم هذا ال ‪ Tablespace‬من قبل ال ‪ Oracle Server‬لدارة قاعدة‬
‫البيانات ‪ ،‬حيث يحتوى على ال ‪ Data Dictionary‬والجداول التى تحتوى على‬
‫معلومات إدارية حول قاعدة البيانات ‪ ،‬كذلك يحتوى على )‪.(Sys Schema‬‬

‫‪:Sysaux Tablespace -2‬‬


‫وهو ‪ Tablespace‬مساعد لل ‪ System Tablespace‬يحتوى على بعض المكونات‬
‫والمنتجات التى تستخدم فى إدارة قاعدة البيانات ‪ .‬وهذا ال ‪ Tablespace‬صار‬
‫ضرورى فى قاعدة البيانات إبتداًء من الصدار ‪. Oracle10g‬‬

‫‪:Temp -3‬‬
‫وهو ‪ Tablespace‬يستخدم لتخزين الجداول والمراجع المؤقتة ‪ ،‬مثل عند‬
‫الترتيب ‪ .‬وقد يكون هناك أكثر من ‪ Temporary Tablespace‬فى قاعدة البيانات‬
‫الواحدة ولكن يعمل واحد فى اللحظة على قاعدة البيانات ‪.‬‬

‫‪61‬‬
:Undo -4
‫ لتخزين ال‬Oracle Server ‫ من قبل ال‬Tablespace ‫يستخدم هذا ال‬
Undo Information
‫ المعلومات القديمة‬، ‫ هل فكرت كيف يمكن التراجع عن عملية تعديل لحقل معين‬،
.Tablespace ‫يتم حفظها فى هذا ال‬

:‫عملى‬

: ‫ جديد‬Tablespace ‫ انشاء‬-1

CREATE TABLESPACE TEST DATAFILE 'D:\TEST\TEST1DBF'


SIZE 10M NOLOGGING;

Locally Managed ‫ فإن الصل هو‬Tablespace ‫بما أننا لم نحدد نوع إدارة ال‬
.Tablespace

CREATE TABLESPACE TEST DATAFILE 'D:\TEST\TEST.DBF'


SIZE 10M EXTENT MANAGEMENT LOCAL UNIFORM 100K;

62
CREATE TABLESPACE TEST DATAFILE 'D:\TEST\TEST.DBF'
SIZE 10M EXTENT MANAGEMENT LOCAL AUTOALLOCATE;

Tablespaces ‫ زيادة حجم ال‬-2

.Tablespace ‫ جديد لل‬Data File ‫الطريقة الولى إضافة‬

ALTER TABLESPACE TEST ADD DATAFILE


‘D:\TEST\TEST.DBF’ SIZE 5M;

. ‫ الموجودة‬Data File ‫الطريقة الثانية زيادة حجم ال‬

ALTER DATABASE DATAFILE 'D:\TEST\TEST.DBF' RESIZE


12M;

:Tablespace ‫ حزف ال‬-3

63
.Data Files ‫ فقط دون ال‬Tablespace ‫الطريقة الولى مسح ال‬

DROP TABLESPACE TEST;

‫ موجود على نظام التشغيل ويمكن إستخدامه عند‬Data File ‫بهذه الطريقة يظل ال‬
. ‫ جديد‬Tablespace ‫إنشاء‬

CREATE TABLESPACE OBAY DATAFILE 'D:\TEST\TEST.DBF'


REUSE;

.Data File ‫ ومعه ال‬Tablespace ‫الطريقة الثانية حزف ال‬

DROP TABLESPACE OBAY INCLUDING CONTENTS AND


DATAFILES;

:Read Only ‫ إلى الوضع‬Tablespace ‫ تحويل ال‬-4

ALTER TABLESPACE TEST READ ONLY;

64
.Read Only ‫ فى الوضع‬System Tablespace ‫حاول أن تضع ال‬

.Sysaux Tablespace ‫لحظ الرسالة كذلك الحال عن ال‬

:Read Write ‫ الى الوضع‬Tablespace ‫ تحويل ال‬-5

ALTER TABLESPACE TEST READ WRITE;

:Offline ‫ الى الوضع‬Tablespace ‫ تحويل ال‬-6

ALTER TABLESPACE TEST OFFLINE

:Online ‫ الى الوضع‬Tablespace ‫ نحويل ال‬7

ALTER TABLESPACE TEST OFFLINE;

65
:Tablespace ‫ لعادة تسمية ال‬8-

ALTER TABLESPACE TEST RENAM TO EXAM;

:Temporary Tablespace ‫ إنشاء‬-9

CREATE TEMPORARY TABLESPACE TEMPEXAM TEMPFILE


'D:\TEST\TEMPEXAM.DBF' SIZE 7M;

‫ فى قاعدة‬Default Temporary Tablespace ‫ هو ال‬Tablespace ‫وحتى يكون هذا ال‬


.‫البيانات‬

ALTER DATABASE DEFAULT TEMPORARY TABLESPACE


TEMPEXAM;

. Default Temporary Tablespace ‫يمكن التأكد من ال‬

SELECT PROPERTY_NAME,PROPERTY_VALUE FROM


DATABASE_PROPERTIES WHERE
PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE';
66
:Temporary Tablespace Group ‫ إنشاء‬-10
Resource ‫ تستخدم عند نقص ال‬Oracle 10g ‫وهو ميزة مستحدثة فى الصدار‬
. ‫المستخدم للتخزين المؤقت‬

CREATE TEMPORARY TABLESPACE TEMPG1 TEMPFILE


'D:\TEST\TEMPG1.DBF' SIZE 4M TABLESPACE GROUP
GROUB1;

.Group ‫ اخر لنفس ال‬Tablespace ‫أنشاء‬

.Group ‫ موجود أصل ً لل‬Tablespace ‫إضافة‬

ALTER TABLESPACE TEMPEXAM TABLESPACE GROUP GROUP1;

67
:Big Tablespace ‫ إنشاء‬-11

CREATE BIGFILE TABLESPACE BIG1 DATAFILE


‘D:\TEST\BIG1.BDF’ SIZE 20M;

TABLESPACES & DATAFILES ‫للستعلم عن ال‬


DBA_TABLESPACES
USER_TABLESPACES
DBA_TABLESPACE_GROUPS
V$TABLESPACE
DBA_DATA_FILES
DBA_TEMP_FILES

68
69
‫‪:Control File‬‬

‫او يمكن أن نسميه ملف التحكم وهو ملف ثنائى اى ل يمكن قراءته‬
‫إذ أنه ليس نصيا ً ‪ ،‬وبدونه ل تعمل قاعدة البيانات ‪ ،‬وييم قراءته فى الوضع ‪، Mount‬‬
‫إذا ً يمكن أن نفتح قاعدة البيانات فى الوضع ‪ Nomount‬حتى لو فقدنا ملف ال‬
‫‪. Control File‬‬
‫وبالطبع يكون تابع لقاعدة بيانات واحدة ‪ ،‬ويتم تحديثه فقط عن طريق ال‬
‫‪ Oracle Server‬اثناء عمل قاعدة البيانات فل يستطيع مدير قاعدة البيانات تحديثه ‪.‬‬
‫إذا فقدنا ال ‪ Control File‬نحتاج لسترجاعه قبل فتح قاعدة البيانات من‬
‫جديد ‪.‬‬
‫يتم إنشاؤه أثناء إنشاء قاعدة البيانات ‪ ،‬كما يمكن زيادة عدد ال ‪Control File‬‬
‫بعد إنشاء قاعدة البيانات حتى نستطيع السترجاع إذا فقدنا احد ال ‪. Control File‬‬

‫ويحتوى ال ‪ Control Files‬على التى ‪-:‬‬


‫‪ -1‬اسم قاعدة البيانات‪.‬‬
‫‪ -2‬وقت إنشاء قاعدة البيانات‪.‬‬
‫‪ -3‬اسماء ال ‪.Tablespaces‬‬

‫‪70‬‬
‫‪ -4‬إسم ومكان ال ‪ Data Files‬وال ‪.Redo Log Files‬‬
‫‪ -5‬ال ‪ Redo Log‬الحلى وكذلك رقمه المتسلسل ‪.‬‬
‫‪ -6‬ومعلومات عن النسخ الحتياطى ‪ .‬مثل ً معومات ال ‪ . RMAN‬سناقش ذلك لحقا ً‬
‫‪.‬‬
‫‪ -7‬ومعلومات عن الرشيف ‪.‬‬
‫‪ -8‬يحتوى على المعلومات التالية )‪MAXLOGFILES . MAXLOGMEMBERS.‬‬
‫‪.(MAXLOGHISTORY. MAXDATAFILES .MAXINSTANCES‬‬

‫‪:Multiplexing the Control File‬‬


‫والمعنى أن قاعدة البيانات تعمل على عدد من ال ‪ Control File‬مع العلم أن‬
‫كل ملفات ال ‪ Control File‬هى طبق الصل ‪ ،‬نستطيع بهذه الطريقة تأمين قاعدة‬
‫البينات فى حال فقدان احد ال ‪.Control File‬‬
‫والفضل كذلك توزيع هذه الملفات على عدد من ال ‪ Disk‬حتى ل نفقدها‬
‫جميعا ً ‪.‬‬

‫الن نفترض أن لدينا قاعدة البيانات اسمها ‪ OBAY‬تحتوى على ‪ 3‬ملفات‬


‫من ال ‪ Control Files‬نريد أن نضيف لها ملف ‪ Control File‬اخر ‪.‬‬
‫سنقوم بعمل هذا السناريو فى حالين ‪-:‬‬
‫الحال الول ‪ :‬باستخدام ال ‪.SPFILE‬‬
‫الحال الثانى ‪ :‬باستخدام ال ‪.init.ora‬‬

‫الحالة الولى )‪-: (SPFILE‬‬


‫‪ -1‬نقوم بتعديل المتغير ‪ Control_files‬على ملف المتغيرات )‪ ( SPFILE‬ونضيف اليه‬
‫مكان ال ‪ Control File‬الذى نريد أن نضيفه لقاعدة البيانات ‪.‬‬

‫‪ALTER SYSTEM SET‬‬


‫‪CONTROL_FILES='D:\oracle\product\10.1.0\oradata\OBAY‬‬
‫‪\CONTROL01.CTL','D:\oracle\product\10.1.0\oradata\OB‬‬
‫\‪AY\CONTROL02.CTL','D:\oracle\product\10.1.0\oradata‬‬
‫‪OBAY\CONTROL03.CTL','D:\oracle\product\10.1.0\oradat‬‬
‫‪a\OBAY\CONTROL04.CTL' SCOPE=SPFILE‬‬
‫‪71‬‬
‫‪ -2‬يلزمنا إغلق قاعدة البيانات الن حتى يتم تحديث التعديل السابق ‪.‬‬

‫‪ -3‬عن طريق نظام التشغيل نقوم بعمل نسخ لحد ملفات ال ‪ Control Files‬ال‬
‫موجودة الن ونضعه ونسميه كما حددناه فى المتغير ‪Control_Files‬‬

‫‪ -4‬الن يمكن فتح قاعدة البيانات ‪.‬‬

‫وهكذا قاعدة البيانات الن تعمل باربعة من ال ‪ Control Files‬بدل ً من ثلثة ‪.‬‬

‫لحظ أن العملية تتطلب إغلق لقاعدة البيانات ومن ثم عمل نسخ على نظام‬
‫التشغيل ومن ثم فتح قاعد البيانات من جديد ‪.‬‬

‫‪72‬‬
‫الحالة الثانية )‪-: (init.ora‬‬
‫فى الحالة الولى قاعدة البيانات كانت تعمل على ملف المتغيرات )‬
‫‪ (SPFILE‬والن نفترض أن قاعدة البيانات تعمل على ملف المتغيرات )‬
‫‪-: (initobay.ora‬‬
‫‪ -1‬قفل قاعدة البيانات ‪.‬‬

‫‪ -2‬تعديل المتغير ‪ Control_Files‬على ملف المتغيرات ‪.initobay.ora‬‬

‫‪73‬‬
‫وذلك عن طريق نظام التشغيل ‪.‬‬

‫عند كتابة المر اعله سيفتح ملف المتغيرات ونعدل فى المتغير ‪Control_Files‬‬
‫بحيث نكتب المسار الجديد واسم الملف الجديد ‪ ،‬ولنفترض أن اسمه‬
‫‪ CONTROL05‬فى نفس المسار ‪.‬‬

‫بعد التعديل نقوم بحفظ التعديلت على الملف ‪.‬‬


‫‪ -3‬عن طريق نظام التشغيل نقوم بعمل نسخ لحد ملفات ال ‪Control Files‬‬
‫الموجودة الن ونضعه ونسميه كما حددناه فى المتغير ‪. Control_Files‬‬

‫‪ -5‬فتح قاعدة البيانات ‪.‬‬

‫‪74‬‬
‫بالطبع يمكن التحقق من التعديل عن طريق المر ‪.SHOW APRAMAETERS‬‬

‫تغيير إسم قاعدة البيانات ‪-:‬‬

‫هل فكرت يوما ً تغيير إسم قاعدة بياناتك ؛ لشك أنك فكرت فى هذا لكن‬
‫كيف الطريق إلى ذلك ‪ ،‬فى الحقيقة المر جد ُ يسير ‪ .‬فتغيير إسم قاعدة البيانات‬
‫يلزم تعديل ملفين اثنين هما ملف المتغيرات ‪ Parameter File‬وملف التحكم ‪Control‬‬
‫‪ . File‬واليك الخطوات ‪-:‬‬

‫‪ -1‬التأكد من إسم قاعدة البيانات الن عن طريق الستعلم التالى ‪:‬‬

‫;‪SELECT NAME FROM V$DATABASE‬‬

‫إسم قاعدة البيانات الن ‪.OBAY‬‬

‫‪75‬‬
‫‪ -2‬الن نقوم نقوم بتغيير إسم قاعدة البيانات على ملف التحكم ال ‪. Control File‬‬
‫لكن المشكلة أن هذا الملف ليس نصيا ً حتى نستطيع تعديله ‪ ،‬فهو ملف ثنائى ‪ ،‬لذا‬
‫يمكن اللجوء لعمل نسخ احتياطى لهذا الملف ك ‪. Trace File‬‬
‫نتيجة هذا النسخ الحتياطى ‪ Trace File‬عباره عن ملف نصى يحتوى على‬
‫كود يمكن ان يستعمل لنشاء ‪ Control File‬جديد ‪ ،‬كما يمكن التعديل فى هذا‬
‫الكود ‪ .‬بحيث نغير اسم قاعدة البيانات ‪ .‬يوجد هذا الملف فى المسار المعرف فى‬
‫المتغير ‪. user_dump_dest‬‬
‫والن نجرى عملية النسخ الحتياطى ‪.‬‬

‫;‪ALTER DATABASE BACKUP CONTROLFILE TO TRACE‬‬

‫عند فتح هذا الملف يكون شكله كالتالى ‪:‬‬

‫‪76‬‬
‫ما يهمنا فى هذا الملف هو ما قمنا بتظليله ‪ ،‬والن نقوم بعمل نسخ لهذا‬
‫الجزء المظلل ونحفظه فى ملف جديد ولنفترض أن اسمه ‪. Control.trc‬‬

‫بالطبع إذا قمنا بعمل نسخ احتياطى لل ‪ Control File‬بالطريقة اعله ثم بعد‬
‫ذلك قمنا بتغير تكوينات قاعدة البيانات مثل ً إضافة ‪ Tablespace‬أو ‪، Data File‬‬
‫فيلزمنا تعديل ال ‪ Trace File‬بالتعديلت الجديدة فى حال استخدمناه لنشاء ‪Control‬‬
‫‪.File‬‬
‫يكون شكل الملف ‪ Control.trc‬كالتى ‪:‬‬

‫هذا هو الملف ‪ Control.trc‬الذى سنستخدمه لنشاء ال ‪ Control File‬الجديد ولكن‬


‫قبل ذلك يلزمنا تعديل ما قمت بتظليله على النحو التالى ‪-:‬‬

‫‪77‬‬
‫بعد إجراء هذه التعديلت يلزمنا الحفظ ‪.‬‬

‫‪ -3‬نقوم بإغلق قاعدة البيانات ‪.‬‬

‫‪ -4‬تغيير إسم قاعدة البيانات على الملف ‪ INITobay.ora‬وهو ملف المتغيرات )‬


‫‪ (PFILE‬التى تعمل به قاعدة البيانات الحالية ‪.‬‬

‫نغير إسم قاعدة البيانات ‪ db_name‬من ‪ OBAY‬الى ‪ TEST‬ثم نحفظ‬


‫التعديلت ‪.‬‬

‫‪ -5‬مسح ملفات ال ‪ Control Files‬الحالية فى قاعدة البيانات‪.‬‬

‫‪ -6‬تشغيل قاعدة البيانات فى الوضع ‪. NOMOUNT‬‬

‫‪78‬‬
‫‪ -7‬الن نقوم بإنشاء ال ‪ Control File‬باستخدام ال ‪ Trace File‬الذى قمنا بانشاءه‬
‫سابقا ً ‪.‬‬

‫‪ -8‬نفتح قاعدة البيانات فى الوضع ‪.RESETLOGS‬‬

‫‪ -9‬للتأكد من تغيير اسم قاعدة البيانات‬

‫‪79‬‬
:Redo Log Files

80
‫هذا الملف لتسجيل التغييرات التى تحصل على البيانات بحيث يتم تسجيل‬
‫التغييرات التى تم تثبيتها او ل ‪ ،‬نستفيد من هذا الملفات فى استرجاع قاعدة‬
‫البيانات فى حال حدوث فشل ‪ .‬بحيث تكون هناك بعض البيانات لم تكتب فى ال‬
‫‪ Data Files‬بينما كتبت فى هذا الملفات ‪.‬‬

‫يكون هذا الملف فى شكل ‪ GROUP‬بحيث تعمل كل قاعدة البيانات على على‬
‫القل باثنين من ال ‪. Groups‬‬

‫إذا ً يستخدم هذا الملف اساسا ً لعملية السترجاع فى حالة حدوث خطا ً إذ يحتوى‬
‫على التغييرات التى تحصل على البيانات ‪.‬‬

‫ولضمان الحفاظ على هذا الملف فإن كل ‪ Group‬ينتظم فى شكل ‪ Members‬وكل‬


‫ال ‪ Member‬داخل ال ‪ Group‬هى نسخة طبق الصل الهدف منها تقليل نسبة خطر‬
‫الفقدان ‪.‬‬

‫‪ LGWR Background Process‬يقوم بكتابة البيانات الموجود ال ‪ Redo log Buffer‬الى‬


‫ال ‪.Redo Log Files‬‬

‫لحظة ملئ ال ‪ Redo Log File‬فان ال ‪ LGWR‬يقوم بالتحول لل ‪Redo Log File‬‬
‫الخرى فى عملية تعرف بال ‪. Log Switch‬‬

‫‪81‬‬
‫إذا ً فال ‪ Oracle Server‬يقوم بكتابة كل التغيرات على قاعدة البيانات فى ال ‪Redo‬‬
‫‪ . Log Buffer‬هذه المتغيرات تكتب من ال ‪ Buffer‬إلى ال ‪ Redo Log File‬عن طريق‬
‫ال ‪ LGWR‬فى الحالت التالية ‪-:‬‬
‫‪ -1‬لحظة نثبيت العمليات )‪.(Commit‬‬
‫‪ -2‬لحظة إمتلء ال ‪ Buffer‬الى الثلث ‪.‬‬
‫‪ -3‬قبل عملية ‪.DBWn‬‬

‫إذا ً عملية ال ‪ Log Switch‬تحدث اليا ًً دون تدخل من مدير قاعدة البيانات ‪ ،‬لكن قد‬
‫يحتاج مدير قاعدة البيانات احيانا ً لعمل هذه المهمة يدويا ً من خلل المر التالى ‪-:‬‬

‫;‪ALTER SYSTEM SWITCH LOGFILE‬‬

‫كذلك عملية ال ‪ Checkpoint‬تحدث اليا ً عند حدوث ال ‪ Log Switch‬وهى تقوم‬


‫بعمل تعديل لل ‪ Header‬لكل ال ‪ Data Files‬وال ‪ Control Files‬للشارة بأن اكمل‬
‫بنجاح ‪.‬‬

‫ايضا ً يمكن عمل ‪ Checkpoint‬اليا ً عن طريق مدير قاعدة البيانات بالمر التالى ‪-:‬‬

‫;‪ALTER SYSTEM CHECKPOINT‬‬

‫‪82‬‬
: Online Redo Log Files Group ‫إضافة‬

، ‫ جديد‬Online Redo Log Files Group ‫فى بعض الحيان نحتاج لضافة‬
-: ‫وذلك عن طريق المر التالى‬

ALTER DATABASE ADD LOGFILE GROUP 4


‘D:\ORACLE\PRODUCT\10.1.0\ORADATA\OBAY\REDO04.RD
O’ SIZE 10M;

-: Groups ‫ لل‬Members ‫ولضافة‬

ALTER DATABASE ADD LOGFILE MEMBER


'D:\oracle\product\10.1.0\oradata\OBAY\RED1.RDO'
TO GROUP
1, ,'D:\oracle\product\10.1.0\oradata\OBAY\RED2.
RDO' TO GROUP 2,
'D:\oracle\product\10.1.0\oradata\OBAY\RED3.RDO'
TO GROUP
3,'D:\oracle\product\10.1.0\oradata\OBAY\RED4.RD
O' TO GROUP 4;

83
-:Online Redo Log Groups ‫حذف‬

ALTER DATABASE DROP LOGFILE GROUP 4;


، Groups ‫مع ملحظة أن قاعدة اليببانات تعمل على القل على اثنين من ال‬

. current or active Groups ‫كذلك ل يمكن حذف‬

‫ تظل الملفات موجودة على‬Oracle ‫ عن طريق ال‬Group ‫أيضا ً عند حذف ال‬
. ‫مستوى نظام التشغيل‬

-:Online Redo Log Members ‫حذف‬

ALTER DATABASE DROP LOGFILE MEMBER


‘D:\ORACLE\PRODUCT\10.1.0\ORADATA\OBAY\RED3.RDO;

-:Clearing Online Redo Log Files

، Group ‫ فى ال‬Members ‫وهى لحل مشكلة العطل الذى يحدث لكل ال‬
. Redo Log Files ‫فهى ضمنا ً تعنى إعادة إنشاء لل‬

84
‫;‪ALTER DATABASE CLEAR LOGFILE GROUP 2‬‬

‫إذا كانت قاعدة البيانات تعمل فى الوضع ‪ Archive log‬فإن عملية ال‬
‫‪ Clearing‬اعله ستفشل إذا كان ال ‪ Group 2‬لم تتم ارشفته ‪ ،‬عموما ً سنتحدث عن‬
‫موضوع الرشيف لحقا ً ولكن لحل‬
‫هذا الشكال يمكن تعديل المر السابق للتى ‪-:‬‬

‫‪ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP‬‬


‫;‪2‬‬

‫ولكن يجب قبل القيام بهذا المر بعمل نسخ إحتياطى كامل لقاعدة البيانات ) ‪Full‬‬
‫‪. (Backup‬‬

‫إعادة تسمية ال ‪-:Redo Log Files‬‬


‫يمكن إعادة تسمية ال ‪ Redo Log Files‬او تغيير مكانه عن طريق إضافة ‪Log‬‬
‫‪ File‬جديد وحذف القديم ‪ .‬يمكن كذلك إستخدام المر ‪ALTER DATABASE‬‬
‫‪ RENAME FILE‬لكن هذا المر يتطلب جلب قاعدة البيانات فى الوضع ‪.MOUNT‬‬

‫فقدان ال ‪:Redo Log File‬‬


‫إذا فقدنا ‪ Member‬من ال ‪ Redo Log Files Group‬فإن قاعدة البيانات‬
‫ستظل مفتوحة ومتاحة ما دام أن هناك ‪ Member‬اخرى فى ال ‪ ، Group‬لكن سوف‬
‫نستقبل رسائل تحذيرية فى ال ‪ . Alert log File‬بالطبع يمكن السترجاع بعمل نسخ‬
‫لحد ال ‪ Member‬الموجود ومن ثم اعادة تسميتها ‪.‬‬

‫‪85‬‬
:Redo Log File ‫للستلم عن ال‬

86
87
‫سنتطرق قى هذا الفصل لكل من التى‪-:‬‬

‫• إنشاء وإدارة المستخدمين فى قاعدة البيانات‬


‫اوركل ‪.‬‬
‫• إنشاء وإدارة الوظائف ‪. Roles‬‬
‫• منح وسحب الصلحيات ‪.Privileges‬‬
‫• التحكم فى الموارد ‪ Resource‬المستخدمة عن‬
‫طريق المستخدمين ‪.‬‬

‫‪88‬‬
‫وهذا الفصل من الهمية بمكان ‪ ،‬بحيث يعتبر من اهم اولويات مدير قاعدة‬
‫البيانات ‪.‬‬

‫فالفكرة الساسية تقوم على أن الوصول لقاعدة البيانات يتطلب وجود‬


‫مستخدم يمتلك صلحية الوصول ‪ ،‬إذا ل يمكن ان تظل قاعدة البيانات متاحة‬
‫للجميع ‪.‬‬

‫واول ما يمكن مناقشته هنا كيفية إنشاء مستخدم فى قاعدة البيانات ‪ .‬فمدير‬
‫قاعدة البيانات يجب مراعاة التى عند إنشاء المستخدمين ‪-:‬‬
‫‪ -1‬ان يكون اسم المستخدم فريدا ً فى قاعدة البيانات وأن ل يتعدى عدد حروفه‬
‫‪ 30‬حرفا ً ‪ ،‬وايضا ً ل يحتوى على مساحات ويبتدئ بحرف اى ليس رقما مثل ً ‪.‬‬
‫‪ -2‬وسيلة التحقق ‪ .‬سواء اكان ذلك عن طريق قاعدة البيانات او عن طريق نظام‬
‫التشغيل او غيره ‪.‬‬
‫‪ Default Tablespace -3‬وهو ال ‪ Tablespace‬الذى يستخدم لنشاء وتخزين كائنات‬
‫المستخدم ‪.‬‬
‫‪ Temporary Tablespace -4‬وهو ال ‪ Tablespace‬الذي يستخدم لنشاء الكائنات‬
‫المؤقتة للمستخدم ‪.‬‬
‫‪ -5‬ال ‪ Profile‬للمستخدم وهو لدارة الموارد وكلمة السر للمستخدم ‪.‬‬

‫عند إنشاء مستخدم فى قاعدة اليبانات يتم خلق ‪ Schema‬وهى مجموعة الكائنات‬
‫الممتلكة للمستخدم وتكون اسم ال ‪ Schema‬بنفس اسم المستخدم ‪.‬‬
‫ولنفترض اننا الن نريد إنشاء مستخدم ‪. TEST‬‬

‫‪CREATE USER TEST IDENTIFIED BY TEST DEFAULT‬‬


‫‪TABLESPACE USERS TEMPORARY TABLESPACE TEMP‬‬
‫;‪PROFILE DEFAULT PASSWORD EXPIRE ACCOUNT UNLOCK‬‬

‫فى السناريو السابق قمنا بخلق مستخدم اسمه ‪ TEST‬وكلمة السر لهذا‬
‫المستخدم ايضا ً ‪ ، TEST‬هذه المستخدم ينشئ ويخزن الكائنات فى ‪Users‬‬
‫‪ ، Tablespace‬كما يخزن الكائنات المؤقتة فى ‪ . Temp Tablespace‬هذا المستخدم‬

‫‪89‬‬
‫يجب عليه تغيير كلمة السر عند اول دخول كما نشاهد ادناه ‪ ،‬ايضا هذا المستخدم‬
‫‪ ACCOUNT‬غير مغلق اى يمكن التصال بعد تغيير كلمة السر‪.‬‬

‫بالطبع قد لنحتاج لتحديد ال ‪ Default Tablespace‬وكذلك ال ‪.Temporary Tablespace‬‬


‫بمعنى اخر إذا كان ‪ Default Temporary Tablespace‬فى قاعدة البيانات هو ‪Temp‬‬
‫وكان ال ‪ Default Tablespace‬فى قاعدة البيانات هو ‪ Users‬فل يلزمنا تحديد ذلك عند‬
‫إنشاء المستخدم إذا كنا ل نريد تغيير ال ‪.Default‬‬
‫كذلك الحال بالنسبة لل ‪ Profile‬فإنه إذا لم يتم تحديده فسوف ُيمنح ال ‪Default‬‬
‫‪. Profile‬‬

‫‪:QUOTA‬‬
‫وهى الحصة المتاحة للمستخدم لنشاء الكائنات فى ال ‪ Tablespaces‬وبدونها‬
‫يكون المستخدم عاجز عن إنشاء اى كائن ‪.‬‬
‫لذا يمكن لمدير قاعدة البيانات منع المستخدم من إنشاء أى كائن عن طريق‬
‫منحه حصة ‪ Quota‬تساوى صفر فى ال ‪. Tablespace‬‬
‫كذلك يستطيع مدير قاعدة البيانات منح المستخدم حصة ‪ Quota‬غير محدودة‬
‫فى ال ‪ Tablespace‬عن طريق منحه ‪. Unlimited‬‬
‫يمكن منح الحصة للمستخدم اثناء النشاء او بعد ذلك ‪.‬‬

‫فلنفترض الن اننا نريد منح حصة تساوى صفر للمستخدم ‪ TEST‬فى ‪Users‬‬
‫‪. Tablespace‬‬

‫;‪ALTER USER TEST QUOTA 0M ON USERS‬‬


‫ولنفترض الن اننا نريد منحه حصه غير محدودة فى ‪. Users Tablespace‬‬

‫‪90‬‬
ALTER USER TEST QUOTA UNLIMITED ON USERS;

. Unlimited Tablespace ‫هناك خيار اخر وهو منح هذا المستخدم صلحية تسمى‬
.Tablespaces ‫وهى صلحية تسمح لهذا المستخدم حصة غير محدودة فى ال‬

ALTER USER TEST QUOTA UNLIMITED ON USERS;

-: ‫كما ذكرنا سابقا ً يمكن منح الحصة اثناء خلق إنشاء المستخدم كالتى‬

CREATE USER TEST IDENTIFIED BY TEST QUOTA 2M ON


USERS;

-: ‫يمكن الستعلم عن الحصة عن طريق‬


DBA_TS_QUOTAS
USER_TS_QUOTAS

-: ‫وسيلة التحقيق‬

91
‫وهى طريقة التحقق من المستخدمين للوصول لقاعدة البيانات ‪ ،‬فلحظة‬
‫إنشاء المستخدم لبد من اختيار وسيلة التحقق ‪-:‬‬

‫كلمة السر )‪ : (Password‬وهى الطريقة المستخدمة فى السناريوهات‬


‫السابقة ‪ ،‬بحيث يكون التحقق عن طريق قاعدة البيانات اوركل عند محاولة‬
‫الدخول فيتم التحقق من كلمة السر ‪.‬‬
‫وهى تكون كالتى ‪.identified by password -:‬‬

‫‪ :External‬ويكون التحقق عن طريق نظام التشغيل بحيث يستطيع المستخدم‬


‫التصال بقاعدة البيانات دون إدخال اسم المستخدم وكلمة السر لقاعدة‬
‫البيانات‪ .‬وذلك لن كلمة السر لقاعدة البيانات غير مستخدمة فى هذا النوع من‬
‫التحقق ‪.‬‬
‫يتطلب هذا النوع من التحقق تهيئة المتغير ‪ OS_AUTHENT_PREFIX‬بحيث‬
‫يحتوى على قيمة حرفية هى ‪ $OPS‬فى الصل ‪ ،‬بالطبع نستطيع تغيره كما‬
‫نشاء ‪ ،‬هذا المتغير نحتاجه عند عملية التحقق من المستخدم الذى يريد التصال‬
‫بقاعدة البيانات ‪.‬‬
‫ولنفترض أننا قمنا بتغيير المتغير اعله الى القيمة ‪ ، OBAY‬ومستخدم نظام‬
‫التشغيل الذى نستخدمه هو ‪ ADMINISTRATOR‬إذا ً يلزمنا إنشاء مستخدم فى‬
‫قاعدة البيانات اسمه ‪ OBAYADMINISTRATOR‬ونختار طريق التحقق‬
‫‪. External‬‬

‫تابع معى الخطوات ‪-:‬‬


‫‪ -1‬نتأكد من قيمة المتغير ‪OS_AUTHENT_PREFIX‬‬

‫;‪SHOW PARAMETER OS_AUTHENT_PREFIX‬‬

‫‪ -2‬نقوم بتغير المتغير الى القيمة ‪ OBAY‬مثل ً‬

‫'‪ALTER SYSTEM SET OS_AUTHENT_PREFIX='OBAY‬‬


‫;‪SCOPE=SPFILE‬‬

‫‪92‬‬
‫بالطبع نحتاج لغلق قاعدة البيانات وفتحها من جديد ‪.‬‬

‫‪ -3‬الن يمكن التأكد من قيمة التغير ‪.‬‬

‫‪ -4‬الن نقوم بخلق المستخدم ‪ OBAYADMINISTRATOR‬فى قاعدة البيانات ‪.‬‬

‫‪CREATE USER OBAYADMINISTRATOR IDENTIFIED‬‬


‫;‪EXTERNALLY‬‬

‫يمكن الستعلم عن المستخدمين فى قاعدة البيانات عن طريق ‪:‬‬


‫‪DBA_USERS‬‬
‫كما يمكن معرفة نوع التحقق عن ال ‪ SESSION‬المفتوحة فى قاعدة البيانات‬

‫‪SELECT sid,authentication_type, osuser FROM‬‬


‫;‪V$SESSION_CONNECT_INFO‬‬

‫‪93‬‬
‫الن المستخدم ‪ OBAYADMINISTRATOR‬يستطيع التصال بقاعدة البيانات‬
‫مباشرة ودون التحقق من قاعدة البيانات فالتحقق يتم عن طريق نظام التشغيل‪.‬‬
‫الصلحيات )‪:(Privilege‬‬
‫كل المستخدمين الذين قمنا بخلقهم فى السناريوهات السابقة ل يستطيعون‬
‫التصال بقاعدة البيانات فضل ً عن القيام بأى مهام اخرى إذ ليس لديهم صلحيات‬
‫لذلك ‪.‬‬
‫فى الخطوات السابقة قمنا بخلق المستخدم وحددنا له طريقة التحقق‬
‫ومنحناه الحصة المطلوبة وحددنا له ال ‪ Profile‬لدارة كلمة السر والموارد ‪ ،‬لكن‬
‫ينتظرنا الن أن نعطيه صلحيات للعمل فى قاعدة البيانات ‪ .‬ويكون منح الصلحيات‬
‫عن طريق مدير قاعدة البيانات او ممن يملك الصلحيات ‪.‬‬

‫هناك نوعن من الصلحيات ‪-:‬‬


‫‪ -:System -1‬وهو لتمكين المستخدمين من انجاز اعمال معينة على قاعدة البيانات‬
‫‪.‬‬
‫وهناك اكثر من ‪ 700‬صلحية ‪ System Privileges‬على قاعدة اليبانات ‪ ،‬على سبيل‬
‫المثال ‪:‬‬

‫‪ : SYSDBA & SYSOPER‬هذه الصلحيات تسمح للمستخدم إغلق وفتح قاعدة‬


‫البيانات‪.‬‬
‫‪ : CREATE TABLESPACE‬تسمح للمستخدم إنشاء ‪.Tablespace‬‬

‫عموما ً يمكن استعراض كل الصلحيات ‪ System Privileges‬المتاحة لمدير قاعدة‬


‫البيانات عن طريق الستعلم التى ‪-:‬‬

‫;‪SELECT PRIVILEGE FROM DBA_SYS_PRIVS‬‬


‫ولنفترض أننا نريد منح بعض الصلحيات ‪ System Privileges‬للمستخدم ‪. TEST‬‬

‫;‪GRANT CREATE TABLESPACE TO TEST‬‬

‫هكذا منحنا المستخدم ‪ TEST‬صلحية إنشاء ال ‪. Tablespace‬‬

‫يجب مراعاة الكلمة ‪ ANY‬عند منح الصلحيات ‪ ،‬ولتوضيح هذا المعنى نلحظ الفرق‬
‫بين الصلحيتين ‪:‬‬
‫‪ :SELECT TABLE‬تسمح للمستخدم عمل ‪ SELECT‬على الجداول التى يملكها‬
‫المستخدم‪.‬‬

‫‪94‬‬
‫‪ :SELECT ANY TABLE‬تسمح للمستخدم عمل استعلم ‪ SELECT‬على الجداول‬
‫التى يملكها المستخدمين الخرين‪.‬‬

‫هناك خيار عند منح الصلحيات ‪ System Privileges‬للمستخدم وهو الخيار ‪WITH‬‬
‫‪.ADMIN OPTION‬‬
‫هذا الخيار يعنى ان المستخدم بعد أن يملك الصلحية يستطيع منحها لغيره من‬
‫المستخدمين ‪.‬‬

‫;‪GRANT ALTER SYSTEM TO TEST WITH ADMIN OPTION‬‬

‫المستخدم ‪ TEST‬الن يملك الصلحية ‪ ALTER SYSTEM‬ويستطيع منحها‬


‫لغيره من المستخدمين ‪.‬‬
‫هنااك بعض الصلحيات التى يجب ان ل تمنح الى لمديرى قاعدة البيانات ويجب‬
‫مراعاة السرية عند المنح مثل ً )‪SYSDBA & SYSOPER & RESTRICTED‬‬
‫‪ (SESSION & ALTER DATABASE‬وغيره من الصلحيات التى يجب أن تكون‬
‫فقط لمدراء قاعدة البيانات ‪..‬‬
‫بالطبع يمكن سحب الصلحيات من المستخدمين ‪ ،‬ولنفترض أننا نريد سحب‬
‫صلحية ‪ CREATE TABLESPACE‬من المستخدم ‪.TEST‬‬

‫;‪REVOKE CREATE TABLESPACE FROM TEST‬‬


‫تخيل معى هذا السناريو وهو أن مدير قاعدة البيانات منح المستخدم ‪TEST‬‬

‫صلحية ‪ CREATE TABLESPACE‬عن طريق الخيار ‪، WITH ADMIN OPTION‬‬


‫قام المستخدم ‪ TEST‬بإنشاء ‪ Tablespace‬ومن ثم منح هذه الصلحية لمستخدم‬
‫اخر اسمه ‪.TEST1‬‬
‫اراد مدير قاعدة البيانات سحب الصلحية ‪ CREATE TABLESPACE‬من‬
‫المستخدم ‪.TEST‬‬
‫اول سيستم سحب الصلحية من المستخدم دون التاثير على المهام التى نفذها‬
‫بواسطة هذه الصلحية وهى هنا انشاء ال ‪.Tablespace‬‬
‫ثانيا ً ‪ :‬المستخدم ‪ TEST1‬ل يتاثر بسحب الصلحيات من المستخدم ‪TEST‬‬

‫‪95‬‬
‫هذا المستخدم يستطيع معرفة ما يمكله من صلحيات ‪ System Privileges‬عن‬
‫طريق الستعلم ‪-:‬‬

‫;‪SELECT PRIVILEGE FROM USER_SYS_PRIVS‬‬

‫للستعلم ‪:‬‬
‫‪DBA_ROLES‬‬
‫‪USER_ROLE_PRIVS‬‬
‫‪DBA_ROLE_PRIVS‬‬
‫‪ROLE_ROLE_PRIVS‬‬
‫‪ROLE_SYS_PRIVS‬‬
‫‪ROLE_TAB_PRIVS‬‬
‫‪SESSION_PRIVS‬‬

‫‪ -:Privileges Object -2‬وهو لتمكين المستخدم للوصول واستعمال الكائن‬


‫المعين ‪ ،‬بدون هذه الصلحيات المستخدم له الصلحيات على الكائنات التى يملكها‬
‫فقط ‪.‬‬

‫المستخدم فى قاعدة البيانات له صلحيات بالطبع على الكائنات التى يملكها ‪،‬‬
‫يستطيع المستخدم ان يمنح صلحيات لمستخدم اخر للوصول للكائنات التى يملكها‬
‫‪ ،‬وكذلك مدير قاعدة البينات يستطيع منح صلحيات للمستخدمين للوصول لكائنات‬
‫يملكها مستخدم اخر ‪.‬‬

‫نفترض ان المستخدم ‪ TEST‬يملك جدول اسمه ‪ ، EXAMPLE‬هذا المستخدم يريد‬


‫منح صلحية ‪ SELECT‬على هذا الجدول للمستخدم ‪.TEST1‬‬

‫;‪GRANT SELECT ON EXAMPLE TO TEST1‬‬

‫‪96‬‬
‫ماذا لو اراد مدير قاعدة البيانات منح صلحية ‪ SELECT‬على الجدول ‪EXAMPLE‬‬
‫الذى يمتلكه المستخدم ‪ TEST‬للمستخدم ‪.TEST1‬‬

‫;‪GRANT SELECT ON TEST.EXAMPLE TO TEST1‬‬

‫كذلك يمكن استخدام الخيار ‪ WITH GRANT OPTION‬عند منح الصلحيات ‪Objects‬‬
‫‪ Privileges‬إشارة إلى أن هذا المستخدم بعد ان يملك هذه الصلحية يمكن أن‬
‫يمنحها غيره من المستخدمين ‪.‬‬

‫‪GRANT INSERT ON EXAMPLE TO TEST1 WITH GRANT‬‬


‫;‪OPTION‬‬
‫الن المستخدم ‪ TEST1‬يستطيع منح صلحية ‪ SELECT‬على الجدول‬

‫‪ EXAMPLE‬الذى يملكه المستخدم ‪ TEST‬لغيره من المستخدمين ‪.‬‬

‫ماذا لو اراد المستخدم ‪ TEST‬سحب صلحية ال ‪ SELECT‬على الجدول‬


‫‪ EXAMPLE‬الذى يملكه من المستخدم ‪ TEST1‬مع ملحظة ان المستخدم ‪TEST1‬‬
‫منح هذه الصلحية لغيره من المستخدمين ولنفترض انه ‪ ، TEST2‬النتيجة هى ان‬
‫الصلحية ستسحب من المستخدم ‪ TEST1‬وكذلك كل المستخدمين الممنوحين‬
‫الصلحية عن طريق المستخدم ‪ TEST1‬؛ وهنا هو المستخدم ‪. TEST2‬‬

‫سنتابع هذا السناريو عمليا ً ‪-:‬‬

‫;‪SHOW USER‬‬

‫‪97‬‬
‫نحن الن نعمل على المستخدم ‪.TEST‬‬

‫المستخدم ‪ TEST‬يملك جدول ً واحدا ً هو ‪.EXAMPLE‬‬


‫الن المستخدم ‪ TEST‬سيمنح صلحية ‪ SELECT‬على الجدول ‪ EXAMPLE‬الذى‬
‫يمتلكه للمستخدم ‪.TEST1‬‬

‫‪GRANT SELECT ON EXAMPLE TO TEST1 WITH GRANT‬‬


‫;‪OPTION‬‬

‫الن عن طريق المستخدم ‪ TEST1‬يمكن عمل ‪ SELECT‬على الجدول اعله ‪:‬‬

‫الن المستخدم ‪ TEST1‬يستطيع منح صلحية ‪ SELECT‬على الجدول ‪EXAMPLE‬‬


‫الذى يمتلكه المستخدم ‪ TEST‬للمستخدم ‪.TEST2‬‬

‫;‪GRANT SELECT ON TEST.EXAMPLE TO TEST2‬‬

‫الن المستخدم ‪ TEST2‬يستطيع عمل ‪ SELECT‬على الجدول ‪. EXAMPLE‬‬

‫‪98‬‬

‫;‪SELECT * FROM TEST.EXAMPLE‬‬


. TEST1 ‫الن نقوم بسحب الصلحية من المستخدم‬

REVOKE SELECT ON EXAMPLE FROM TEST1;

. EXAMPLE ‫ للجدول‬SELECT ‫ نقوم بعمل‬TEST1 ‫عن طريق المستخدم‬

‫ على الجدول‬SELECT ‫لحظ ان المستخدم فقد صلحية عمل اسنعلم‬


. EXAMPLE

SELECT * FROM TEST.EXAMPLE;

.TEST2 ‫ماذا عن المستخدم‬

SELECT * FROM TEST.EXAMPLE;

99
. EXAMPLE ‫ ل يملك صلحية الستعلم على الجدول‬TEST2 ‫كذلك المستخدم‬
: ً ‫ مثل‬، ‫يمكن منح الصلحية على مستوى العمود‬

: ‫ بعدة طرق منها‬Objects Privileges ‫يمكن الستعلم عن ال‬


DBA_TAB_PRIVS
ALL_TAB_PRIVS
USER_TAB_PRIV
DBA_COL_PRIVS
ALL_COL_PRIVS
USER_COL_PRIVS
SESSION_PRIVS

-:ROLES

100
‫تخيل معى انك تعمل مدير لقاعدة بيانات بها اكثر من ‪ 100‬مستخدم ‪ ،‬هؤلء‬
‫المستخدمين على مستويات مختلفة من الصلحيات ‪ ،‬ولنفترض انهم على خمسة‬
‫مستويات ‪.‬‬

‫ما العمل إذا ً ؟ هل تمنح كل مستخدم صلحياته بمفرده ؟ يلزمك إذا ً عمل ً‬
‫شاقا ً طويل ً ‪.‬‬
‫الحل بكل بساطة هو فى ال ‪.ROLES‬‬

‫الفكرة هى انه يمكن دمج مجموعة من الصلحيات فى كائن واحد يسمى‬


‫‪ ، ROLE‬فالسناريو السابق لمدير قاعدة البينات الذى يدير قاعدة بيانات بها اكثر‬
‫من ‪ 100‬مستخدم على مستويات مختلفة وهى خمسة مستويات ابسط مما تتخيل‬
‫‪ ،‬يلزمنا المرإنشاء خمسة من ال ‪ ROLES‬بعد ذلك نمنح الصلحيات لهذه ال‬
‫‪ ROLES‬حسب المستويات ومن ثم منحها للمستخدمين ‪.‬‬
‫هذا الحل يسهل علينا عملية ادارة الصلحيات فبدل من ادارة اكثر من ‪100‬‬
‫مستخدم يلزمنا المر ادارة خمسة من ال ‪.ROLES‬‬
‫كذلك عند تعديل اى من ال ‪ ROLES‬فإن التعديل ينعكس اليا على‬
‫المستخدمين فيسهل علينا عملية التعديل ‪ ،‬كذلك هذه العملية تحسن الداة ‪.‬‬

‫ولنفترض اننا نريد إنشاء ‪ ROLE‬جديدة تسمى ‪ ،OBAY‬هذه ال ‪ROLE‬‬


‫نمنحها بعض الصلحيات ولتكن ‪ ، CONNECT & RESOURCE‬بعد ذلك نمنح هذه‬
‫ال ‪ ROLE‬للمستخدم ‪.TEST‬‬

‫;‪CREATE ROLE OBAY‬‬

‫يجب مراعاة أن إسم ال ‪ ROLE‬ان يكون فريدا ً فى قاعدة البيانات بحيث يكون‬
‫السم لم يستعمل كمستخدم ول ك ‪ Roles‬فى قاعدة البيانات‪.‬‬

‫بالطبع يمكن انشاء ‪ ROLE‬ومنحها درجة من السرية عن طريق منحها كلمة سر‬
‫للتحقق ‪.‬‬
‫;‪CREATE ROLE ROLENAME IDENTIFIED BY PASSWORD‬‬

‫الن نمنح هذه ال ‪ ROLE‬بعض الصلحيات ‪.‬‬

‫‪101‬‬
‫;‪GRANT CONNECT,RESOURCE TO OBAY‬‬
‫;‪GRANT OBAY TO TEST‬‬

‫نمنح هذه ال ‪ ROLE‬للمستخدم ‪.TEST‬‬

‫ملحظة ‪ :‬يمكن اختيار الخيار ‪ WITH ADMIN OPTION‬عند منح ال ‪ . ROLE‬هذا‬


‫الخيار يمكن المستخدم بعد امتلك ال ‪ ROLES‬منحها لغيره من المستخدمين ‪.‬‬

‫يمكن سحب ال ‪ ROLE‬من المستخدم بنفس طريقة سحب ال ‪. System Privilege‬‬

‫;‪REVOKE OBAY FROM TEST‬‬

‫كذلك يمكن اجراء تعديلت على ال ‪ ROLES‬ولنفترض مثل ً اننا نريد عمل كلمة سر‬
‫لل ‪. OBAY ROLE‬‬

‫;‪ALTER ROLE OBAY IDENTIFIED BY OBAY‬‬

‫‪102‬‬
‫يمكن حذف ال ‪ ROLE‬عن طريق المر ‪.‬‬

‫;‪DROP ROLE OBAY‬‬


‫عند حذف ال ‪ ROLE‬يقوم ‪ ORACLE SERVER‬بحذف هذه ال ‪ ROLE‬من كل‬

‫منحوا هذا ال ‪ ROLE‬اليًا‪.‬‬


‫المستخدمين الذين ُ‬

‫‪:PROFILES‬‬
‫وهو لإدارة كلمة السر وكذلك الموارد ‪ ،‬فبعد كم سيتم انهاء كلمة السر؟‬
‫وماهى عدد المحاولت الفاشلة قبل ان يتم اغلق حسابك ؟ وكم ‪ SESSION‬يسمح‬
‫للمستخدم فتحها فى قاعدة البيانات؟ وغيره من السئلة التى يجب عنها ال‬
‫‪.PROFILE‬‬
‫وكما ذكرنا سابقا ً اى مستخدم فى قاعدة البيانات لبد أن يكون له‬
‫‪ PROFILE‬إذا لم يتم تحديد ذلك عند النشاء فان ال ‪ ORCLE SERVER‬سوف يمنح‬
‫المستخدم ‪ PROFILE‬يسمى ‪ DEFAULT‬هذا ال ‪ PROFILE‬يتم خلقه مع إنشاء‬
‫قاعدة البيانات ول يمن حزفه من قاعدة البيانات ‪.‬‬
‫بالطبع يمكن إنشاء وتعديل وحذف ‪ PROFILE‬من قاعدة البيانات ‪.‬‬

‫والسؤال الن ماهى النقاط التى يديرها ال ‪ PROFILE‬بالنسبة لكلمة السر ؟‬


‫‪ :FAILED_LOGIN_ATTEMPTS‬وهى عدد المحاولت الفاشلة للمستخدم‬
‫لمحاولة دخول قاعدة البيانات قبل اغلق حسابه‪.‬‬
‫‪ :PASSWORD_LIFE_TIME‬لتحديد عدد اليام التى يستطيع بها المستخدم دخول‬
‫قاعدة البيانات بكلمة السر قبل إنتهاءها‪.‬‬
‫‪ :PASSWORD_REUSE_TIME‬لتحديد عدد اليام قبل استخدام كلمة السر مرة‬
‫اخرى‪ .‬اذا تم تحديد هذا الخيار يجب ان يكون الخيار‬
‫‪.PASSWORD_REUSE_MAX=UNLIMITED‬‬
‫‪ :PASSWORD_REUSE_MAX‬لتحديد عدد كلمات السر التى تم تغيرها قبل‬
‫استخداها مرة اخرى‪ .‬اذا اتم تحديد هذا الخيار يجب أن يكون الخيار‬
‫‪.PASSWORD_REUSE_TIME=UNLIMITED‬‬
‫‪ :PAWWORD_LOCK_TIME‬لتحديد عدد اليام قبل قفل هذا المستخدم‪.‬‬

‫‪103‬‬
‫‪ :PASSWORD_GRACE_TIME‬لتحديد عدد اليام التى بعدها يتم اصدار تحذيرات‬
‫أنه بعد هذه الفترة سيتم إنهاء كلمة السر الحالية‪.‬‬
‫‪ :PASSWORD_VERFY_FUNTION‬لتحديد الدالة التى ترسم سياسة اختيار‬
‫كلمة السر‪.‬‬

‫أما بالنسبة بالمصادر المتاحة فيتم تحديد التى ‪:‬‬


‫‪ :CONNECT TIME‬لتحديد الدقائق المسموح بها للمستخدم المتصل بقاعدة‬
‫البيانات قبل قطع اتصاله اليًا‪.‬‬
‫‪ :IDLE TIME‬لتحديد الدقائق المسموح بها للمستخدم المتصل بقاعدة البيانات ان‬
‫يظل عاطل عن العمل قبل قطع اتصاله اليُا‪.‬‬
‫‪ :CONCURRENT SESSIONS‬لتحديد عدد ال ‪ SESSEIONS‬المسموح بها‬
‫للمستخدم للتصال بقاعدة البيانات‪.‬‬
‫‪ :PRIVATE SGA‬لتحديد المساحة المتاحة للمستخدم فى ال ‪ PRIVATE SGA‬هذا‬
‫إذا كنا نعمل فى الوضع ‪.SHARED SERVER‬‬

‫الن نفترض الن اننا نريد أنشاء ‪ PROFILE‬جديد اسمه ‪.NEWPROFILE‬‬

‫‪CREATE PROFILE NEWPROFILE LIMIT‬‬


‫‪FAILED_LOGIN_ATTEMPTS 3‬‬
‫‪PASSWORD_LOCK_TIME UNLIMITED‬‬
‫‪PASSWORD_LIFE_TIME 60‬‬
‫‪PASSWORD_REUSE_TIME 60‬‬
‫‪PASSWORD_GRACE_TIME 7‬‬
‫‪CONNECT_TIME 1000‬‬
‫‪IDLE_TIME 30‬‬
‫;‪SESSIONS_PER_USER UNLIMITED‬‬

‫‪104‬‬
‫ اعله‬PROFILE ‫ماذا لو اردنا تعديل ال‬

ALTER PROFILE NEWPROFILE LIMIT


SESSIONS_PER_USER 5;

.PROFILE ‫الن يمكن منح الممستخدمين هذا ال‬

ALTER USER TEST PROFILE NEWPROFILE;

.‫ عند إنشاء المستخدم‬PROFLE ‫بالطبع يمكن منح هذا ال‬

PROFILE ‫لعمل استلم عن ال‬


DBA_PROFILES

.NEWPROFILE PROFILE ‫ولنفترض مثل ً اننا نريد معرفة تفاصيل‬

SELECT RESOURCE_NAME,LIMIT FROM DBA_PROFILES WHERE


PROFILE='NEWPROFILE';

105
‫اذا اردنا معرفة كل ال ‪ PROFILES‬الموجودة فى قاعدة البيانات‬

‫;‪SELECT DISTINCT (PROFILE) FROM DBA_PROFILES‬‬

‫كذلك يمكن حذف هذا ال ‪PROFILE‬‬

‫‪106‬‬
DROP PROFILE NEWPROFILE CASCADE;

107
108
‫فى الحقيقة هذا الفصل من الهمية بمكان ‪ ،‬فالحفاظ على بقاء واتاحة قاعدة‬
‫البيانات هو المر الهم لمدير قاعدة البيانات ‪ ،‬لذا كان لزاما ً على مدير قاعدة‬
‫البيانات تأمين قاعدة البيانات حتى ل تكون فى مهب الريح‪.‬‬

‫وحسب ملحظتى فإن هذا الجانب ل يحظى بالهتمام الكبر بالنسبة لمديرى قاعدة‬
‫البيانات بل يكون التركيز دائما ً على وضع استراتيجيات مناسبة للنسخ الحتياطى ‪،‬‬
‫رغم أن أننا نلجأ كثيرا ً لسترجاع النسخ الحتياطية نتيجة تقصيرنا فى جانب تأمين‬
‫قاعدة البيانات ‪ ،‬فلنرفع إذا ً شعار الوقاية خير من العلج ‪ ،‬ونبادر فى تأمين قاعدة‬
‫البيانات ‪.‬‬

‫المر ليس معقدا ً لكن يعتمد على التخطيط ‪ ،‬خصوصا إذا كانت قاعدة البيانات‬
‫ضخمة وعدد المستخدمين كبير ‪.‬‬

‫‪109‬‬
‫والحديث فى هذا الفصل يمكن ان يقسم الى قسمين رئيسيين ‪-:‬‬
‫‪ -1‬تأمين قاعدة البيانات ‪ :‬وهو حماية قاعدة البيانات من المخاطر الداخلية‬
‫والخارجية ‪.‬‬
‫‪ -2‬مراقبة قاعدة البيانات ‪ :‬فبعد المخاطر ناتجة عن سلوك بعض المستخدمين ‪،‬‬
‫لذا كان على مدير قاعدة البيانات مراقبة ما يراه مهما لمتابعة سلوك‬
‫المستخدين ‪.‬‬

‫‪ -1‬تأمين قاعدة البيانات ‪-:‬‬


‫هناك الكثير من الخطوات التى يمكن أن يتخذها مدير قاعدة البيانات لتأمين‬
‫فاعدة البيانات ‪ ،‬سأذكر منها ما اراه مهما ً ‪:‬‬

‫‪ -1‬التأكد من تأمين الشبكة ‪ :‬اعرف أن المر ليس من مهامك ادرك هذا جديدا ً‬
‫لكن اجلس مع المسؤول من تأمين الشبكة وتأكد من إنتفاء جميع المخاطر ‪ ،‬لن‬
‫تجد هذه النقطة فى كتب اوركل ؛ بل هى تجربة شخصية وانا اعمل فى مؤسسة‬
‫مالية فى احد الدول العربية لول أن النسخ الحتياطى )‪ (Backup‬كان حاضرا ً ؛ لكنا‬
‫الن فى احد سجون المن القتصادى لهفوة قام بها المسؤول من تأمين الشبكة‬
‫استطاع من خللها احد القراصنة الدخول للمخدم وتعطيل قاعدة البيانات ‪ ،‬كنت‬
‫واثقا ً من عدم مسؤليتى من هذا الختراق لكن مشكلتنا فى كثير من الدول العربية‬
‫أننا لم نستطيع بعد استيعاب مفهوم التخصصية ‪.‬‬

‫‪110‬‬
‫‪ -2‬حماية ال ‪ :DATA DICTIONARY‬كل المعلومات التى نحتاجها عن قاعدة‬
‫البيانات موجودة فى ال ‪ DATA DICTIONARY‬لذا كان لزاما ً على مدير قاعدة‬
‫البيانات حمايتها ‪.‬‬
‫وذلك بوضغ القيمة ‪ FALSE‬فى المتغير ‪.O7_DICTIONARY_ACCESSIBILITY‬‬

‫عموما ً فى اوركل ‪ 10g‬هذا المتغير فى الصل ‪.FALSE‬‬


‫يمكن التأكد من ذلك عن طريق‪:‬‬

‫;‪SHOW PARAMETER O7_DICTIONARY_ACCESSIBILITY‬‬

‫بهذه التهيئة نضمن ان اى مستخدم يملك صلحية الوصول الى كل جدول *‬


‫‪ ANY TABLE‬مثل ً ‪ DROP ANY TABLE‬ل يستطيع مسح ال ‪DATA‬‬
‫‪.DICTIONARY‬‬
‫كذلك هذه التهيئة تمنع المستخدم ‪ SYS‬من الدخول لقاعدة البيانات بدون الصلحية‬
‫‪.SYSDBA‬‬
‫‪ -3‬سحب الصلحية الغير مهمة من ‪: PUBLIC‬‬
‫وهو ‪ ، DATABASE SERVER USER GROP‬لن كل الصلحيات التى تمنح لل‬
‫‪ PUBLIC‬يستطيع استخدمها مستخدمى قاعدة البيانات لذا يجب سحب كل‬
‫الصلحيات غير المهمة من ال ‪.PUBLIC‬‬

‫هكذا نستطيح منح الصلحيات لل ‪.PUBLIC‬‬

‫;‪GRANT ALTER ANY TABLE TO PUBLIC‬‬

‫الن كل المستخدمين فى قاعدة البيانات يمكنهم استخدام هذه الصلحية ‪.‬‬

‫بالطبع يمكن سحبها‪.‬‬

‫;‪REVOKE ALTER ANY TABLE FROM PUBLIC‬‬

‫‪111‬‬
‫‪ -3‬الحد من الصلحيات الدارية من المستخدميين ‪ :‬ما الفائدة من منح كل‬
‫المستخدمين فى قاعدة البيانات ‪ ، DBA ROLE‬هذه ال ‪ ROLE‬تمنح لمدير قاعدة‬
‫البيانات وليس لكل المستخدين ‪ ،‬كذلك الصلحية ‪SYSDBA & DROP AY TABLE‬‬
‫وغيرها من الصلحيات التى قد تسبب لك المشاكل ول حاجة لمنحها لكل‬
‫المستخدين ‪.‬‬

‫‪ -4‬منع التحقق من بعد عن طريق نظام التشغيل ‪ :‬وذلك بوضع القيمة‬


‫‪ FALSE‬فى المتغير ‪ ، REMOTE_OS_AUTHET‬حتى نمنع التصال عن بعد بقاعدة‬
‫البيانات بواسطة التحقق عن طريق نظام التشغيل ‪ .‬هذا المتغير فى الصل يأخذ‬
‫القيمة ‪ FALSE‬فى اوركل ‪. 10g‬‬
‫تحدثنا سابقا ً عن طرق التحقق من المستخدين وذكرنا أن احد الطرق هو عن‬
‫طريق نظام التشغيل ‪. EXTERNAL‬‬

‫‪112‬‬
‫‪ -2‬مراقبة قاعدة البيانات ‪MONITORING OR‬‬
‫‪-:((AUDITING‬‬
‫مراقبة قاعدة البيانات هو جزء من تأمين قاعدة البيانات ونستطيع من خلل‬
‫عملية المراقبة ايجاد كثير من الجابات لبعض المور التى ستظل غامضة لول‬
‫عملية المراقبة ‪ ،‬ويمكن تقسيم عملية المراقبة الى ثلث انواع ‪-:‬‬

‫‪ :Standard Database Auditing -1‬وهو لمتابعة وحفظ معلومات عن عمليات‬


‫التصال وقطع التصال بقاعدة البيانات ‪ ،‬وايضا ً متابعة أستخدام )‪System‬‬
‫‪ ( Privileges and Object Privileges‬داخل قاعدة البيانات ‪ ،‬كعمليات النشاء‬
‫والحذف والستعلم والتعديل وغيره من العمليات ‪.‬‬

‫‪ :Value-based auditing -2‬فى النوع الول تابعنا عمليات التصال وكذلك متابعة‬
‫العمليات داخل قاعدة البيانات ‪ ،‬ولكن قد نحتاج للحفاظ عل القيم التى يتم تغيرها‬
‫فى قاعدة البيانات ‪.‬‬

‫‪ :Fine-grained auditing -3‬هذا النوع لحفظ عبارات ال ‪ SQL‬التى تم تنفيذها فى‬


‫قاعدة البيانات ‪.‬‬

‫ولكن قبل التفصيل فى انواع المراقبة لبد من الشارة أن قاعدة البيانات اوركل‬
‫‪ 10g‬لبد من تهيئتها قبل بدء فى عمليات المراقبة بواسطة المتغير ‪AUDIT_TRAIL‬‬
‫الذى يأخذ أحد القيم التالية ‪-:‬‬
‫‪ :NONE -1‬وهى تعنى أن قاعدة البيانات غير جاهزة لعملية المراقبة ‪.‬‬
‫‪ :DB -2‬وهى تعنى ان معومات المراقبة يتم حفظها فى قاعدة البيانات فى جداول‬
‫تنتمى للمستخدم ‪. SYS‬‬
‫‪ :OS -3‬وهى تعنى أن معلومات المراقبة يتم حفظها على مستوى نظام التشغيل ‪،‬‬
‫فإذا كنا نعمل على بيئة ويندوز ‪ Widows‬فان البيانات تحفظ فى ال ‪ ، Event Log‬اما‬
‫إذا كنا نعمل على ‪ UNIX or LINUX‬فإن المعلومات تخزن كملفات فى المسار‬
‫المحدد على المتغير ‪. AUDIT_FILE_DEST‬‬

‫الصدار اوركل ‪ 10g‬يدعم مختلف انواع المراقبة ‪ ،‬بحيث يستطيع مدير قاعدة‬
‫البيانات مراقبة كل الحداث التى تحدث فى قاعدة البيانات ‪ ،‬تخيلت معى حجم‬
‫البيانات التى يتم تخزينها إذا قمنا بمراقبة كل ما يحدث فى قاعدة البيانات ل شك‬
‫أن ذلك سينعكس سلبا ً على أداء قاعدة البيانات لذا كان لزاما ً على مدير قاعدة‬
‫البيانات التركيز فى المراقبة بحيث يتم مراقبة ما نحتاجه دون الفراط فى‬
‫المراقبة ‪.‬‬
‫فإذا أردنا مثل ً مراقبة بعض الجداول فالفضل التركيز على تحديد العمليات‬
‫التى يجب متابعتها مثل ً فقط الحذف ‪ ،‬اما اذا قمت بمتابعة كل ما يحدث للجداول‬
‫فإن ذلك سيؤثر على اداء قاعدة البيانات فسوف يتم متابعة الستعلم والتعديل‬
‫والمسح وغيره ‪ ،‬إذا التركيز امر مهم فى عملية المراقبة ‪.‬‬

‫‪113‬‬
‫واول ما يلزمنا فعله هو تهيئة قاعدة البيانات بتغير قيمة المتغير ‪AUDIT_TRAIL‬‬
‫من القيمة ‪ NONE‬الى احد القيم التالية )‪ (DB OR OS‬ولنفترض هنا أننا نريد تخزين‬
‫معلومات المراقبة داخل قاعدة البيانات إذا ً نختار القيمة ‪.DB‬‬

‫لكن قبل ذلك نتأكد من المتغير ‪.AUDIT_TRAIL‬‬

‫;‪SHOW PARAMETER AUDIT_TRAIL‬‬


‫نقوم بتحويل قيمة المتغير ‪ AUDIT_TRAIL‬ال القيمة ‪ DB‬مع مراعاة أن هذا‬

‫المتغير غير ّالى ‪ ،‬أى يحتاج إلى إغلق وفتح قاعدة البيانات حتى تتأثر قيمة‬
‫المتغير ‪.‬‬

‫;‪ALTER SYSTEM SET AUDIT_TRAIL=DB SCOPE=SPFILE‬‬


‫ثم نغلق ونفتح قاعدة البيانات ونتأكد من قيمة المتغير ‪.‬‬

‫‪114‬‬
‫‪:Standard Database Auditing -1‬‬
‫كما ذكرنا سابقا ً هذا النوع من المراقبة يتركز على مراقبة عملية التصال‬
‫بقاعدة البيانات وكذلك متابعة إستخدام )‪( System Privileges and Object Privileges‬‬
‫‪.‬‬
‫كما يجب الذكر أن هناك خيارين أثناء عملية المراقبة )‪BY SESSION & BY‬‬
‫‪، ( ACCESS‬‬
‫‪ :BY SESSION‬وهى تعنى تخزين حقل واحد من المعلومات أثناء عمليات المراقبة‬
‫لنوع معين من العمليات لكل ‪ ، SESSION‬ولتضح الرؤية أكثر لنفترض أننا قمنا‬
‫بمراقبة عملية التعديل على جداول مستخدم معين ولنفترض أنه ‪ ، X‬فقام احد‬
‫المستخدمين بفتح ‪ SESSION‬واستخدم هذه ال ‪ SESSION‬لتعديل ‪ 5‬جداول تنتمى‬
‫للمستخدم ‪ .X‬فإن عملية المراقبة ستقوم بتخزين حقل واحد فقط لعملية التعديل‬
‫ما دام أنه قام بالتعديل بنفس ال ‪ ، SESSION‬اى بمعنى اخر أنها توازى عبارة‬
‫‪.GROUP BY SESSION‬‬
‫‪ :BY ACCESS‬يمكن اتخاذ نفس المثال السابق ‪ ،‬لكن هنا سيتم تخزين ‪ 5‬حقول‬
‫كل حقل هو عبارة عن عملية التعديل التى حدثت لكل جدول‪.‬‬
‫ل شك أن الخيار ‪ BY SESSION‬قد ل يكون كافيا ً احيانا ً لمعرفة تفاصيل معلومات‬
‫المراقبة لذا قد نلجأ للخيار ‪ BY ACCESS‬الذى نجد فيه تفاصيل أكثر لكن بالطبع‬
‫يزيد عمليات تخزين المعلومات‪.‬‬
‫فى هذا النوع من المراقبة كما ذكرنا الفضل فيه عملية التركيز ويكون‬
‫التركيز بتحديد المستخدم كذلك بتحديد نجاح او فشل العملية )‪SUCCESSFUL OR‬‬
‫‪. (NOT SUCCESSFUL‬‬

‫وهذا النوع من المراقبة ‪ Standard Database Auditing‬يحتوى على‬


‫اقسام فرعية‪-:‬‬
‫* ‪:SESSION AUDITING‬‬

‫‪115‬‬
‫وهى جزء من النوع الول من المراقبة ‪ ، Standard Database Auditing‬بحيث يتم‬
‫مراقبة عمليات التصال وقطع التصال بقاعدة البيانات ‪ ،‬ويمكن التركيز بتحديد‬
‫المستخدم الذى نريد مراقبة عملياتة اتصاله كما يمكن متابعة كل المستخدمين‬
‫بإستخدام المر ‪ AUDIT SESSION‬كما يمكن التركيز ايضا ً بتحديد عملية نجاح أو‬
‫فشل عملية التصال ‪.‬‬
‫نفترض أننا نريد مراقبة كل عمليات التصال الناجحة وقطع التصال بالنسبة‬
‫للمستخدم ‪ TEST‬ولننا نريد معرفة وقت التصال وقطع التصال فالفضل استخدم‬
‫الخيار ‪.BY ACCESS‬‬
‫‪AUDIT SESSION BY TEST BY ACCESS WHENEVER‬‬
‫;‪SUCCESSFUL‬‬

‫ماذا الن لو قام المستخدم ‪ TEST‬بالتصال بقاعدة البيانات‬

‫الن مدير قاعدة البيانات يستطيع أن يشاهد معلومات عن عملية التصال اعله‬

‫‪SELECT‬‬
‫‪SERNAME,TERMINAL,ACTION_NAME,EXTENDED_TIMESTAMP‬‬
‫;‪FROM DBA_AUDIT_SESSION‬‬

‫ظهر لمدير قاعدة البيانات ان المستخدم ‪ TEST‬قام بالتصال بقاعدة‬


‫البيانات بالتاريخ والزمن المحدد من الجهاز ‪ NBS‬كما يمكن استعراض معلومات‬
‫اخرى عن اسم مستخدم الجهاز وغيره من المعلومات ‪.‬‬

‫ماذا لو قام المستخدم ‪ TEST‬بقطع التصال ؟‬

‫‪116‬‬
‫بالطبع ستظهر لمدير قاعدة البيانات معلومات اضافية‬

‫‪SELECT‬‬
‫‪USERNAME,TERMINAL,ACTION_NAME,TO_CHAR(EXTENDED_TIM‬‬
‫‪ESTAMP,'DD-MM-YYYY:HH-MI-‬‬
‫)'‪SS'),TO_CHAR(LOGOFF_TIME,'DD-MM-YYYY:HH-MI-SS‬‬
‫;‪FROM DBA_AUDIT_SESSION‬‬

‫الن يظهر لمدير قاعدة البيانات الن المستخدم ‪ TEST‬قام بقطع التصال بقاعدة‬
‫البيانات فى الزمن المحدد اعله ‪ ،‬اى أنه ظل متصل بقاعدة البيانات حوالى ‪21‬‬
‫دقيقة ‪.‬‬

‫يمكن ايضا ً استعلم معلومات التصال وقطع التصال بقاعدة البيانات بواسطة‬
‫الجدول ‪. DBA_AUDIT_TRAIL‬‬
‫إذا ً معلومات التصال وقطع التصال بقاعدة البيانات متوفرة فى كل من )‬
‫‪(DBA_AUDIT_SESSION & DBA_AUDIT_TRAIL‬‬

‫يمكن لمدير قاعدة البيانات الستعلم عن خيارات المراقبة التى قام بتهيئتها فى‬
‫قاعدة البيانات بواسطة‬
‫‪DBA_OBJ_AUDIT_OPTS‬‬
‫‪DBA_STMT_AUDIT_OPTS‬‬
‫‪DBA_PRIV_AUDIT_OPTS‬‬

‫‪SELECT USER_NAME,AUDIT_OPTION,SUCCESS,FAILURE FROM‬‬


‫;‪DBA_STMT_AUDIT_OPTS‬‬

‫‪117‬‬
‫بالطبع يمكن إلغاء عملية المراقبة ‪ ،‬فلو أردنا إلغاء عملية مراقبة إتصال المستخدم‬
‫‪ TEST‬التى قمنا بمراقبتها سابقا ً‪.‬‬

‫;‪NOAUDIT SESSION BY TEST‬‬

‫الن لو قمنا بعملية استعلم لعرض خيارات المراقبة التى قمنا بتهيئتها فلن نجد‬
‫خيار مراقبة اتصال المستخدم ‪.TEST‬‬

‫* ‪:SQL STATEMENT AUDITING‬‬


‫تخيل معى أن مدير قاعدة البيانات يريد مراقبة عمليات ال ‪ DDL‬مثل إنشاء‬
‫او حذف جدول ‪ .‬فى هذا النوع من المراقبة يمكن التركيز بواسطة تحديد‬
‫المستخدم وكذلك بواسطة نجاح او فشل العملية ‪ ،‬لكن هذا فى إطار ما يملك‬
‫المستخدم ‪ ،‬فلو قام مستخدم مثل ً بإنشاء جدول فى ‪ SCHEMA‬لمستخدم اخر فإن‬
‫هذا النوع من المراقبة يدخل فيما يسمى ‪ SYSTEM PRIVILEGE AUDITING‬وهو‬
‫ما سنناقشه لحقا ‪ ،‬أما هنا فقط فى اطار ما يمكلك المستخدم فقط ‪.‬‬

‫ولنفترض أننا نريد مراقبة عملية إنشاء الجداول بواسطة المستخدم ‪ TEST‬داخل‬
‫مساحته اى فى نفس ال ‪.SCHEMA‬‬

‫;‪AUDIT CREATE TABLE BY TEST BY ACCESS‬‬

‫‪CREATE TABLE USER_MASTER (USER_NO‬‬


‫‪NUMBER(5),USER_NAME VARCHAR2(40),CONSTRAINT‬‬
‫;))‪PK_USER_NO PRIMARY KEY(USER_NO‬‬
‫‪118‬‬
‫ستظهر المعلومات لمدير قاعدة البيانات ‪.‬‬

‫‪SELECT USERNAME,OWNER,TO_CHAR(TIMESTAMP,'DD-MM-‬‬
‫‪YYYY:HH-MI-SS'),OBJ_NAME,ACTION_NAME FROM‬‬
‫;'‪DBA_AUDIT_TRAIL WHERE OWNER='TEST‬‬

‫لكن لو قام المستخدم ‪ TEST‬مثل ً بإنشاء جدول فى ‪ SCHEMA‬اخرى فإن خيارات‬


‫المراقبة اعله لن تاتى بمعلومات اللهم إل إذا رقبنا الصلحية ‪CREATE ANY‬‬
‫‪ TABLE‬وهو ما سنناقشه فى الخطوة القادمة ‪.‬‬

‫يمكن الستعلم عن الخيار التى قمنا بتهيئتها لمراقبة ‪ SQL STATEMENT‬بواسطة‬


‫‪:‬‬
‫‪DBA_STMT_AUDIT_OPTS‬‬
‫‪DBA_PRIV_AUDIT_OPTS‬‬

‫‪119‬‬
‫يمكن إلغاء المراقبة بواسطة‬

‫* ‪:SYSTEM PRIVILEGE AUDITING‬‬


‫وذلك لمراقبة عمليات استخدام الصلحيات ‪ SYSTEM PRIVILEGES‬داخل‬
‫قاعدة البيانات ‪ ،‬مثل ً الصلحية ‪ ، CREATE ANT TABLE‬بالطبع يمكن تركيز‬
‫عملية مراقبة الصلحيات بواسطة مستخدم معين كذلك بواسطة نجاح العملية أو‬
‫فشلها ‪ ،‬فى الصل يتم تخزين عمليات مراقبة الصلحيات ‪SYSTEM PRIVILEGES‬‬
‫كحقل لكل عملية وذلك لستخدام الخيار ‪ BY ACCESS‬فى الصل لكن بالطبع‬
‫يمكن استعمال الخيار ‪ BY SESSION‬لتقليل عمليات تخزين المعلومات فيتم تخزين‬
‫حقل واحد لكل ‪ SESSION‬قامت بإستخدام الصلحية المراقبة ‪.‬‬

‫ولنفترض أننا نريد مراقبة الصلحية ‪ CREATE ANY TABLE‬للمستخدم ‪، TEST‬‬


‫اى بمعنى اخر أننا نريد مراقبة كل الجداول التى يقوم المستخدم ‪ TEST‬بإنشاءها‬
‫فى ‪ SCHEMA‬اخرى ‪.‬‬

‫‪120‬‬
‫ وهى تعنى إنشاء جدول فى‬CREATE ANY TABLE ‫اى مستخدما ً الصلحية‬
.‫ أخرى‬SCHEMA

AUDIT CREATE ANY TABLE BY TEST WHENEVER


SUCCESSFUL;

‫ اى‬EMP SCHEMA ‫ بإنشاء جدول فى‬TEST ‫الن ماذا لو قام المستخدم‬


.EMP ‫فى مساحة المستخدم‬

CREATE TABLE EMP.EMPLOYEE (EMP_NO


NUMBER(4),EMP_NAME VARCHAR(40));

. ‫بالطبع يستطيع مدير قاعدة البيانات متابعة هذه الخطوة‬

SELECT
USERNAME,OWNER,OBJ_NAME,ACTION_NAME,TO_CHAR(TIMEST
AMP,'DD-MM-YYYY:HH-MI-SS') FROM DBA_AUDIT_OBJECT
WHERE USERNAME='TEST';

121
‫نعم لقد قام المستخدم ‪ TEST‬بإنشاء جدول ‪ EMPLOYEE‬فى المستخدم‬
‫‪ EMP‬فى الزمن المحدد اعله ‪.‬‬
‫ً‬
‫بالطبع يمكن متابعة باقى الصلحيات مثل ‪ ((DROP ANY TABLE‬وغيرها‬
‫من الصلحيات ‪.SYSTEM PRIVILEGES‬‬

‫للستعلم عن تهيئة خيارات مراقبة ال ‪.SYSTEM PRIVILEGES‬‬

‫‪SELECT * FROM DBA_PRIV_AUDIT_OPTS WHERE‬‬


‫;'‪PRIVILEGE='CREATE ANY TABLE‬‬

‫يمكن إلغاء المراقبة‬

‫* ‪:OBJECT PRIVILEGE AUDITING‬‬

‫‪122‬‬
‫وهذا النوع لمراقبة العمليات التى تحدث على الكائنات من جداول ‪TABLES‬‬
‫ومناظير ‪ VIEWS‬وغيرها من الكائنات ‪.‬‬
‫يمكن التركيز بواسطة تحديد المستخدم وكذلك بواسطة نجاح أو فشل العملية ‪.‬‬
‫الصل فى هذا النوع من المراقبة أن تكون ‪ BY SESSION‬ولكن يمكن تحديد‬
‫الخيار ‪.BY ACCESS‬‬

‫لنفترض أننا نريد مراقبة عمليات الضافة فى الجدول ‪ USER_MASTER‬الموجود‬


‫فى ال ‪ SCHEMA‬التى تسمى ‪.TEST‬‬

‫;‪AUDIT INSERT ON TEST.USER_MASTER BY ACCESS‬‬

‫الن لو قام المستخدم ‪ TEST‬بإضافة بيانات فى الجدول ‪. USER_MASTER‬‬

‫يستطيع مدير قاعدة البيانات متابعة ذلك ‪.‬‬

‫‪SELECT USERNAME,TO_CHAR(TIMESTAMP,'DD-MM-YY:HH-‬‬
‫‪MI-SS'),OBJ_NAME,ACTION_NAME FROM DBA_AUDIT_TRAIL‬‬
‫'‪WHERE USERNAME='TEST' AND OBJ_NAME='USER_MASTER‬‬
‫;'‪AND ACTION_NAME='INSERT‬‬

‫‪123‬‬
‫للستعلم عن خيارات تهيئة مراقبة ال ‪.OBJECT PRIVILEGES‬‬

‫‪select * from DBA_OBJ_AUDIT_OPTS WHERE‬‬


‫;'‪OWNER='TEST' AND OBJECT_NAME='USER_MASTER‬‬

‫هناك ثلث قيم ‪:‬‬


‫‪ : -‬تعنى عدم المراقبة ‪.‬‬
‫‪ :A‬تعنى أن معلومات المراقبة تخزن ‪. BY ACCESS‬‬
‫‪ :S‬تعنى أن معلومات المراقبة تخزن ‪.BY SESSION‬‬

‫لحظ أنه مقابل الحقل ‪ INS‬وجدت القيمة ‪ A/A‬اى أنه تتم مراقبة عملية ال‬
‫‪ INSERT‬بواسطة الخيار ‪ BY ACCESS‬سواء نجحت العملية أو فشلت ‪ ،‬اما إذا كان‬
‫الخيار ‪ WHENEVER SUCCESSFUL‬فإن القيمة ستكون ‪.-/A‬‬

‫يمكن إلغاء عملية المراقبة بواسطة‪.‬‬

‫هكذا نكون قد ناقشنا الخيارات المتاحة للمراقبة التى تنتمى للجزء الول ‪Standard‬‬
‫‪ Database Auditing‬وهى ‪:‬‬
‫‪.SESSION‬‬ ‫‪AUDITING‬‬
‫‪SQL STATEMENT‬‬ ‫‪AUDITING‬‬
‫‪SYSTEM PRIVILEGE‬‬ ‫‪AUDITING‬‬
‫‪OBJECT PRIVILEGE‬‬ ‫‪AUDITING‬‬

‫‪124‬‬
‫‪:Value-Based Auditing -2‬‬
‫فى النوع الول من المراقبة ‪ Standard Database Auditing‬استطعنا‬
‫مراقبة وحفظ معلومات عن العمليات التى تحدث فى قاعدة البيانات ‪ ،‬لكن قد‬
‫نحتاج احيانا ً لحفظ القيم التى يتم تعديلها او حذفها فى قاعدة البيانات ‪ ،‬هذه القيم‬
‫ل يتم حفظها فى ال ‪. Standard Database Auditing‬‬
‫يعمل هذا النوع من المراقبة ‪ Value-Based Auditing‬معتمدا ً على خلق‬
‫‪ Trigger‬بحيث يتم تنفيذه بعد عملية التعديل أو المسح ليحفظ المعلومات والقيم‬
‫التى نريدها ويحفظها فى جدول نقوم بخلقه خصيصا ً لتخزين هذه المعلومات ‪.‬‬

‫بالطبع هذا النوع من المراقبة ‪ Value-Based Auditing‬يقلل من أداء قاعدة‬


‫البيانات اكثر من النوع ‪ Standard Database Auditing‬وذلك لن ال ‪ Trigger‬يتم‬
‫تنفيذه بعد كل عملية تعديل أو مسح ‪.‬‬
‫ولنفترض الن أننا نريد مراقبة وحفظ القيم المعدلة فى الحقل‬
‫‪ BOOK_NAME‬الموجودة فى الجدول ‪ BOOK‬المملوك للمستخدم ‪.TEST‬‬

‫يلزم مدير قاعدة البيانات اول ً تحديد المعلومات التى يريد حفظها ولنفترض‬
‫أنها ‪-:‬‬
‫‪ IP Address -1‬للجهاز الذى استخدم للتصال بقاعدة البيانات ‪.‬‬
‫‪ -2‬اسم مستخدم نظام التشغيل الذ قام بالتصال بقاعدة البيانات ‪.‬‬
‫‪ -3‬التاريخ والزمن ‪.‬‬
‫‪ -4‬قيمة الحقل قبل التعدل وبعد التعديل ‪.‬‬

‫ثانيًا‪ :‬يلزم مدير قاعدة البيانات إنشاء الجدول لتخزين المعلومات عن عمليات‬
‫التعديل ‪,‬‬

‫(‪CREATE TABLE BOOK_AUDIT‬‬


‫‪OS_USER VARCHAR2(70),‬‬
‫‪UPDATE_DATE DATE,‬‬
‫‪125‬‬
‫‪IP_ADDRESS VARCHAR2(16),‬‬
‫;))‪OLD_NEW_NAME VARCHAR2(100‬‬
.Trigger ‫ثالثا ً يقوم مدير قاعدة البيانات بإنشاء ال‬

CREATE OR REPLACE TRIGGER BOOK_NAME_AUDIT


AFTER UPDATE OF BOOK_NAME
ON TEST.BOOK
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
IF :OLD.BOOK_NAME != :NEW.BOOK_NAME THEN
INSERT INTO BOOK_AUDIT
VALUES (SYS_CONTEXT('USERENV','OS_USER'),
SYSDATE,
SYS_CONTEXT('USERENV','IP_ADDRESS'),
:NEW.BOOK_NO ||' BOOK_NO( CHANGED FROM
'||:OLD.BOOK_NAME||
' TO '||:NEW.BOOK_NAME);
END IF;
END;
/

126
‫هكذا تم إنشاء ال ‪ Trigger‬ولنفترض الن أن المستخدم ‪ TEST‬قام بتعديل فى‬

‫الجدول ‪.BOOK‬‬
‫يستطيع مدير قاعدة البيانات متابعة ذلك التعديل بواسطة الجدول‬
‫‪.BOOK_AUDIT‬‬
‫ليقاف هذ النوع من المراقبة يمكن تعطيل أو حذف هذا ال ‪.Trigger‬‬
‫‪:(Fine-Grained Auditing (FGA -3‬‬
‫النواع السابقة من المراقبة تستطيع حفظ معلومات عن العمليات التى تحدث‬
‫فى قاعدة البيانات كما يمكن حفظ القيم التى تتغير ‪ ،‬أما هذا النوع من المراقبة‬
‫فهو لحفظ عبارات ال ‪ SQL‬التى تنفذ فى قاعدة البيانات ويشمل كل من العبارات‬
‫التية ‪ (SELECT & INSERT & UPDATE & DELETE) :‬وذلك باستخدام‬
‫‪ ، DBMS_FGA PACKAGE‬هذه الحزمة تحتوى على اربعة من ال ‪-: Procedure‬‬
‫‪SELECT OS_USER,TO_CHAR(UPDATE_DATE,'DD-MM-YY:HH-‬‬
‫;‪MI-SS'),IP_ADDRESS,OLD_NEW_NAME FROM BOOK_AUDIT‬‬

‫‪127‬‬
‫‪ :ADD_POLICY -1‬لضافة ‪ POLICY‬جديدة لمراقبة عبارات ال ‪ SQL‬فى قاعدة‬
‫البيانات وذلك حسب القيم التى سنحددها فى الجراء ‪.‬‬
‫‪ :PROP_POLICY -2‬لحذف ‪ POLICY AUDIT‬موجودة‪.‬‬
‫‪ :ENABLE_POLICY -3‬لتشغيل ‪ POLICY AUDIT‬كانت معطلة ‪.‬‬
‫‪ :DISABLE POLICY -4‬لتعطيل عمل ‪.POLICY AUDIT‬‬

‫ولنفترض الن أننا نريد حفظ عبارات ال ‪ SELECT‬التى تحدث للجدول ‪BOOK‬‬
‫المملوك للمستخدم ‪ . TEST‬وحتى ل نحفظ كل عبارات ال ‪ SELECT‬التى تحدث‬
‫للجدول ‪ BOOK‬فمن الممكن التركيز على بعض الحقول وذلك بإستخدام بعض‬
‫الشروط ‪.‬‬
‫مثل ً ‪.WHERE BOOK_NO=1‬‬
‫وذلك لتركيز عملية المراقبة ‪.‬‬

‫مدير قاعدة البيانات دائما ً يجب ان يراعى أن ل يفرط فى عملية المراقبة ‪ ،‬بل‬
‫يركز دائما على المطلوب ‪.‬‬
‫الن نقوم بتنفيذ الجراء ‪ ADD_POLICY‬وذلك لضافة ‪ AUDIT POLICY‬تقوم‬
‫بحفظ عبارات ال ‪ SELECT‬التى تنفذ على الجدول ‪ BOOK‬وذلك حسب الشروط‬
‫التى نحددها ‪.‬‬

‫بالطبع هذا الجراء ‪ Procedure‬يحتوى على مجموعة من المتغيرات يجب أن نحدد‬


‫لها قيم ‪ ،‬هذه المتغيرات سنتحدث عنها بشى من التفصيل لحقا ً ‪.‬‬

‫هذه الجراءات ‪ Procedures‬موجودة فى قاعدة البيانات داخل الحزمة ‪DBMG_FGA‬‬


‫اى ل تحتاج منك انشاؤها فقط تحتاج لتنفيذها بعد تحديد قيم المتغيرات ‪.‬‬

‫‪128‬‬
DECLARE
OBJECT_SCHEMA VARCHAR2(200);
OBJECT_NAME VARCHAR2(200);
POLICY_NAME VARCHAR2(200);
AUDIT_CONDITION VARCHAR2(200);
AUDIT_COLUMN VARCHAR2(200);
HANDLER_SCHEMA VARCHAR2(200);
HANDLER_MODULE VARCHAR2(200);
ENABLE BOOLEAN;
STATEMENT_TYPES VARCHAR2(200);
AUDIT_TRAIL BINARY_INTEGER;
AUDIT_COLUMN_OPTS BINARY_INTEGER;

BEGIN
OBJECT_SCHEMA := 'TEST';
OBJECT_NAME := 'BOOK';
POLICY_NAME := 'BOOK_SELEC';
AUDIT_CONDITION := 'BOO_NO=1';
AUDIT_COLUMN := 'BOOK_NAME';
HANDLER_SCHEMA := NULL;
HANDLER_MODULE := NULL;
ENABLE := TRUE;
STATEMENT_TYPES := 'SELECT';
AUDIT_TRAIL := 1;
AUDIT_COLUMN_OPTS := 0;

SYS.DBMS_FGA.ADD_POLICY ( OBJECT_SCHEMA,
OBJECT_NAME, POLICY_NAME, AUDIT_CONDITION,
AUDIT_COLUMN, HANDLER_SCHEMA, HANDLER_MODULE, ENABLE,
STATEMENT_TYPES, AUDIT_TRAIL, AUDIT_COLUMN_OPTS );
COMMIT;
END;
/

‫ وهى تعنى المستخدم الذى يحتوى الجدول او الكائن الذ‬:OBJECT_SCHEMA


.‫ عليه‬SELECT ‫نريد مراقبة عبارات ال‬

129
‫‪ :OBJECT_NAME‬وهو الكائن الذى نريد مراقبة عبارات ال ‪ SELECT‬عليه‪.‬‬

‫‪ :POLICY_NAME‬وهو اسم ال ‪ AUDIT POLICY‬التى نريد خلقها‪.‬‬

‫‪ :AUDIT_CONDITION‬وهى لتحديد الشروط لتركيز عملية المراقبة‪.‬‬

‫‪ :AUDIT_COLUMN‬وهو العمود الذى نريد تركيز عملية المراقبة عليه‪.‬‬

‫‪ :HANDLER_SCHEMA‬احيانا ً قد نحتاج لتحديد اجراء ‪ Procedure‬ليقوم ببعض‬


‫الحداث الضافية اثناء عملية المراقبة ‪ ،‬فنقوم هنا يتحديد المستخدم الذى يحوى‬
‫هذا الجراء‪.‬‬

‫‪ ENABLE :‬لتفعيل عمل ‪ AUDIT POLICY‬ويأخذ هذا المتغير القيمة ‪ TRUE‬فى‬


‫الصل‪.‬‬

‫‪ STATEMENT_TYPES :‬لتحديد نوع عبارات ال ‪ SQL‬التى نريد مراقبتها والصل‬


‫‪.SELECT‬‬

‫‪ :AUDIT_TRAIL‬لتخزين عبارات ال ‪ SQL‬المراقبة فى ال ‪.AUDIT_TRAIL‬‬

‫‪ :AUDIT_COLUMN_OPTS‬ماذا لو قمت بتحديد عدد من العمدة فى المتغير‬


‫‪ ، AUDIT_COLUMN‬هنا لتحديد هل )‪ (ANY OR ANY‬الصل يحتوى عل القيمة ‪0‬‬
‫وهى تعنى ‪.ANY‬‬

‫‪130‬‬
‫الن ماذا لو قام المستخدم ‪ EMP‬بعمل استعلم على الجدول ‪ BOOK‬المنتمى‬
‫للمستخدم ‪ TEST‬بنفس الشروط المذكورة اعله ؟‬

‫;‪SELECT * FROM TEST.BOOK WHERE BOOK_NO=1‬‬

‫‪131‬‬
.‫يستطيع مدير قاعدة البيانات الن متابعة هذا الستعلم‬

SELECT
USERHOST,OS_USER,DB_USER,TO_CHAR(TIMESTAMP,'DD-MM-
YY:HH-MI-SS'),SQL_TEXT FROM DBA_FGA_AUDIT_TRAIL
WHERE DB_USER='EMP;

‫ بعمل إستعلم اخر لم تتحق فيه الشروط‬EMP ‫لو قام المستخدم‬


‫ فإن معلومات هذا الستعلم لن تظهر لمدير‬ADD_POLICY ‫الموضحة فى الجراء‬
.‫قاعدة البيانات‬

‫ التى‬AUDIT_POLICIES ‫بالطبع يستطيع مدير قاعدة البيانات الستعلم عن‬


. ‫تعمل فى قاعدة البيانات‬
.DBA_AUDIT_POLICIES

SELECT
POLICY_NAME,OBJECT_SCHEMA,OBJECT_NAME,POLICY_COLUM
N,SEL FROM DBA_AUDIT_POLICIES;

132
.DISABLE_POLICY ‫ بواسطة الجراء‬AUDIT POLICY ‫يمكن تعطيل هذه ال‬

DECLARE
OBJECT_SCHEMA VARCHAR2(200);
OBJECT_NAME VARCHAR2(200);
POLICY_NAME VARCHAR2(200);

BEGIN
OBJECT_SCHEMA := 'TEST';
OBJECT_NAME := 'BOOK';
POLICY_NAME := 'BOOK_SELECT';

SYS.DBMS_FGA.DISABLE_POLICY ( OBJECT_SCHEMA,
OBJECT_NAME, POLICY_NAME );
COMMIT;
END;
/

.ENABLE_POLICY ‫كما يمكن تفعيلها مره اخرى بواسطة بواسطة الجراء‬

133
DECLARE
OBJECT_SCHEMA VARCHAR2(200);
OBJECT_NAME VARCHAR2(200);
POLICY_NAME VARCHAR2(200);

BEGIN
OBJECT_SCHEMA := 'TEST';
OBJECT_NAME := 'BOOK';
POLICY_NAME := 'BOOK_SELECT';

SYS.DBMS_FGA.ENABLE_POLICY ( OBJECT_SCHEMA,
OBJECT_NAME, POLICY_NAME );
COMMIT;
END;
/

.DROP_POLICY ‫ بواسطة الجراء‬AUDIT POLICY ‫واخيرا ً يمكن حذف‬

134
DECLARE
OBJECT_SCHEMA VARCHAR2(200);
OBJECT_NAME VARCHAR2(200);
POLICY_NAME VARCHAR2(200);

BEGIN
OBJECT_SCHEMA := 'TEST';
OBJECT_NAME := 'BOOK';
POLICY_NAME := 'BOOK_SELECT';

SYS.DBMS_FGA.DROP_POLICY ( OBJECT_SCHEMA,
OBJECT_NAME, POLICY_NAME );
COMMIT;
END;
/

POLICY ‫ فلن تجد هذه ال‬AUDIT_POLICIES ‫الن لو قمت بعمل إستعلم عن ال‬
‫فى قاعدة البيانات‬

135
136
-: Oracle Net Services -1

137
‫أن يكون لديك مخدم ‪ Server Database‬يحتوى على قاعدة البيانات يتصل به‬
‫جميع ‪ Client Application‬او جميع الجهزة التى تحتوى على برامج تحتاج للتصال‬
‫بقاعدة البيانات هذا هو المر الطبيعى والمعتاد والذى تعمل به اغلب الشركات فى‬
‫العالم ‪ ،‬إذ ل يتصور أن تكون جميع الجهزة التى تحتوى على برامج تحتاج للتصال‬
‫بقاعدة البيانات تحتوى ايضا ً على قاعدة البيانات ‪ ،‬وإل فإننا نحتاج لقاعدة البيانات‬
‫لكل جهاز يحتوى عل برنامج وهذا غير مفبول عقل ً ول عم ً‬
‫ل‪.‬‬

‫وإذا سلمنا بأن يكون لدينا مخدم يحتوى على قاعدة البيانات ‪Database‬‬
‫‪ Server‬تستطيع جميع الجهزة التى تحتوى على برامج تحتاج لقاعدة البيانات‬
‫التصال بهذا المخدم ‪ ،‬فإن محور حديثنا فى هذا الفصل سينصب على كيفية إنجاح‬
‫هذا التصال ‪.‬‬

‫إذا ً المر سيكون على جانبين ‪ :‬الجانب الول وهو جانب المخدم ‪Database‬‬
‫‪ Server‬وكيف يستطيع خدمة جميع الطلبات التى تصله للتصال بقاعدة البيانات ‪.‬‬
‫اما الجانب الثانى وهو جانب ال ‪ Client Application‬وهو الجهاز الذى يريد‬
‫التصال بقاعدة البيانات ‪ ،‬وكيف يستطيع الوصول لقاعدة البيانات ؟‬

‫والن سنتحدث عن الجانب الول وهو جانب المخدم ‪ Database Server‬وكيف‬


‫يستطيع خدمة جميع الطلبات للتصال بقاعدة البيانات ؟‬

‫فى هذا الجانب يستطيع المخدم ‪ Database Server‬خدمة طلبات التصال بقاعدة‬
‫البيانات بواسطة ال ‪ Oracle Net Listener‬وهو المسؤول عن عملية معالجة طلبات‬
‫ال ‪ Clients‬للتصال بقاعدة البيانات ‪ ،‬فبدون ال ‪ Listener‬محاولة عملية التصال‬
‫بقاعدة البيانات من خارج المخدم ستبوء بالفشل ‪ ،‬لكن عملية محاولة التصال‬
‫بقاعدة البيانات من داخل المخدم ل تحتاج لل ‪ Listener‬إذ أنه متخصص لستقبال‬
‫الطلبات الخارجية ‪.‬‬

‫يستطيع مستمع واحد ‪ One Listener‬خدمة عدد من ال ‪ ، Database Instances‬وهو‬


‫فى الصل عبار عن ملف يوجد فى المسار التى إذا كنا نعمل على نظام التشغيل‬
‫‪.WINDOWS‬‬
‫‪ORACLE_HOME%\NETWORK\ADMIN\LISTENER.ORA%‬‬
‫أما إذا كنا نعمل على نظام التشغيل ‪UNIX‬‬
‫‪ORACLE_HOME/NETWORK/ADMIN/LISTENER.ORA$‬‬

‫يستطيع مدير قاعدة البيانات تحرير وتهيئة هذا الملف ليستقبل طلبات التصال‬
‫بقاعدة البيانات ‪،‬‬

‫‪138‬‬
‫هذا نموذج لملف ال ‪ Listener‬بحيث يحتوى على ‪ One Listener‬يسمى ‪Listener‬‬
‫يعمل فى المخدم ‪ nbs‬ويراقب ال ‪ Port 1521‬مستخدما ً ‪ ، TCP PROTOCOL‬هذا‬
‫المستمع يخدم ‪ INSTANCE‬تسمى ‪.ORCL‬‬

‫بالطبع يستطيع مدير قاعدة البيانات إضافة مستمع ‪ LISTENER‬جديد ولنفترض أننا‬
‫نريد إضافة مستمع جديد يسمى ‪ LISTENER1‬يعمل فى نفس المخدم ‪ NBS‬يراقب‬
‫ال ‪ PORT 1521‬ويخدم نفس ال ‪ INSTANCE‬التى تسمى ‪ ORCL‬مستخدما ً ‪TCP‬‬
‫‪. PROTOCOL‬‬

‫يكون شكل الملف بعد التعديل كالتى ‪-:‬‬

‫‪139‬‬
‫لحظت التعديلت الجديدة فى الملف ‪ :‬وهى إضافة مستمع جديد يسمى‬
‫‪.LISTENER1‬‬

‫بعد ذلك نستطيع التحكم فى ‪ LISTENERS‬بواسطة المر ‪.LSNRCTL‬‬

‫‪140‬‬
‫الوامر المعروضة ه المتاحة للتعامل مع ال ‪.LISTENER‬‬
‫وهى اوامر لتشغيل وايقاف وعرض حالة المستمع وكذلك وضع كلمة سر وتغيرها‬
‫للمستمع كنوع من التحقق ‪ ،‬وكذلك إعادة تشغيل المستمع ليستوعب ما تم تحديثه‬
‫من تهيئة لملف ال ‪ LISTERNER.ORA‬وغيره من الوامر ‪ ،‬وبما أننا اضفنا مستمع‬
‫جديد اسميناه ‪ LISTENER1‬فالفضل أن نقوم بتشغيل هذا المستمع ‪ ،‬لكن يجب‬
‫التنبيه إلى أنه عند كتابة المر ‪ LISTENER‬فإنه يتم التعامل مع المستمع الصل اى‬
‫‪ DEFAULT‬والذى هنا هو ‪ LISTENER‬لذا إذا اردنا أن نتعامل مع المستمع غير‬
‫الصلى فامامنا احد خياران‪:‬‬
‫الول ‪ :‬تحيد إسم المستمع عند توجيه المر‬

‫الن قمنا بتشغيل المستمع الجديد الذى انشأناه وهو المستمع ‪ ، LISTENER1‬ولو‬
‫لم نكتب إسم المستمع بعد المر ‪ START‬لتم التعامل مع المستمع الصلى وهو‬
‫المستمع ‪.LISTENER‬‬

‫الخيار الثانى ‪ :‬استعمال المر ‪ SET CUR LISTENER_NAME‬لوضع ال‬


‫‪ DEFAULT LISTENER‬الجديد ‪ ،‬اى سيصبح السم الجديد للمستمع هو الصل‬
‫الذى سنتعامل معه ‪.‬‬

‫‪141‬‬
‫الن ‪ LISTENER1‬هو ال ‪.DEFAULT LISTENER‬‬

‫بعد إنشاء المستمع ‪ LISTENER1‬وتشغيله يمكن متابعته عن طريق ال ‪SERVICES‬‬


‫إذا كنا نعمل عل نظام التشغيل ‪.WINDOWS‬‬

‫الن المستمع ‪ LISTENER1‬يستطيع استقبال طلبات التصال بقاعدة البيانات على‬


‫ال ‪ PORT 1521‬فى المخدم ‪ NBS‬مستعمل ً ‪ TCP PROTOCOL‬ليخدم ‪ORCL‬‬
‫‪.INSTANCE‬‬

‫إذا أردنا مراقبة ومعرفة معلومات عن المستمع فالفضل استخدام المر‬


‫‪ SERVICE‬لعرض معلومات عن المستمع مثل اسم المستمع‬ ‫‪ STATUS‬او‬
‫واصداره ومتى تم تشغبله وال ‪ services‬التى يخدمها ‪ ،‬ومسار ملف ال‬
‫‪ LISTENER.ORA‬وغيرها من المعلومات‪.‬‬

‫‪142‬‬
‫كما ذكرنا أن مستمع واحد يستطيع خدمة عدد من ال ‪ INSTANCES‬كما‬
‫يمكن ان يتشارك عدد من المستمعين ‪ LISTENERS‬فى خدمة ‪ INSTANCE‬واحدة‬
‫‪ ،‬كما يمكن ان يكون هناك عدد من ال ‪ INSTANCES‬فى الجهاز الواحد فيكون لكل‬
‫واحد منها مستع يخدمها ‪.‬‬

‫من الصدار ‪ Oracle8i‬فصاعدا ً يتم تسجيل ال ‪ Instance‬الجديدة اليا ً فى ال‬


‫‪ Default Listener‬اى ل يحتاج مدير قاعدة البيانات إضافتها يدويا ً فى ال ‪، Listener‬‬
‫وذلك فيما يعرف ‪. Dynamic Service registration‬‬
‫هكذا نكون إنتهينا من تهيئة الجانب الول وهو المخدم ‪، DATABASE SERVER‬‬
‫وفى الصفحات التالية سنتحدث عن الجانب الخر وهو جانب ال ‪.Clients‬‬

‫ليستطيع ال ‪ Client‬التصال بقاعدة البيانات فى ‪ Database Server‬يحتاج‬


‫لمعرفة بعض المعلومات الضرورية لنجاح عملية التصال ‪:‬‬
‫‪ -1‬المخدم او ال ‪ HOST‬الذى يعمل فيه المستمع ‪.Listener‬‬
‫‪ -2‬ال ‪ Port‬الذى يراقبه المستمع‪.‬‬
‫‪ -3‬البروتكول ‪ Protocol‬الذى يستخدمه المستمع‪.‬‬
‫‪ -4‬اسم ال ‪ service‬او ال ‪ Instance‬الذى يخدمه المستمع‪.‬‬

‫‪143‬‬
‫فعندما يطلب البرنامج او ال ‪ Application‬التصال بقاعدة البيانات من خلل‬
‫المستمع ‪ Listener‬يحتاج لمعرفة المعلومات الموضحة اعله ليترجم ذلك فى عملية‬
‫إتصال ناجح ‪ ،‬أما كيف يعالج هذه المعلومات لتتم عملية التصال فهناك عدة‬
‫طرق ‪-:‬‬

‫‪-:Easy Connect -1‬‬


‫فى هذا النوع من التصال يحتاج المستخدم لكتابة كل المعلومات التى‬
‫يحتاجها ال ‪ Client‬للتصال بقاعدة البيانات ‪ ،‬يكتب هذه المعلومات اثناء عملية‬
‫التصال وذلك على النحو التالى‪-:‬‬
‫>‪<username>/<password>@<hostname>:<listener port>/<service name‬‬

‫‪CONN SYSTEM/SYS@NBS:1521/OBAY‬‬

‫حيث ‪ :NBS‬هو اسم الذى يعمل عليه المستمع ‪.Listener‬‬


‫‪ :1521‬هو ال ‪ PORT‬الذى يراقبه المستمع‪.‬‬
‫‪ :OBAY‬هو اسم ال ‪ Instance‬التى يخدمها المستمع‪.‬‬

‫وهذا النوع هو اسهل طرق التصال من حيث أنه ل يحتاج لتهيئة فى ال ‪.Client‬‬

‫‪-:Local Naming -2‬‬


‫فى النوع السابق من التصال ‪ Easy Connect‬تحتاج لكتابة المعلومات وهى )‬
‫‪ (host & protocol & port & service name‬اثناء عملية التصال مما يسبب نوع‬
‫المشقة ‪ ،‬فى هذا النوع من التصال ل نحتاج الى كتابة ذلك عند كل عملية اتصال‬
‫وانما نقوم بتهيئة الملف‬
‫‪ .ORACLE_HOME/network/admin/tnsnames.ora$‬إذا كنا نعمل على نظام‬
‫التشغيل ‪ UNIX‬او الملف التالى إذا كنا نعمل على نظام التشغيل ‪WINDOWS.‬‬
‫‪%ORACLE_HOME%\NETWORK\ADMIN\TNSNAMES.ORA‬‬
‫بحيث نقوم بعمل اسم مستعار لكل المعلومات المطلوبة اثناء عملية‬
‫التصال وهى )‪ (host & protocol & port & service name‬بحيث يمثل هذا السم‬
‫المستعار المعلومات اعله ‪ ،‬فل نحتاج اثناء عملية التصال سواء كتابة السم‬
‫المستعار مع اسم المستخدم وكلمة السر ‪ ، username/password@alias‬نستطيع‬
‫وضع قائمة من عمليات تهيئة السماء المستعارة التى تمثل مجموعة التصالت‬
‫بقاعدة البيانات فى الملف ‪.tnsnames.ora‬‬

‫‪144‬‬
‫هذا نموذج للملف ‪ . tnsnames.ora‬يستطيع هذا ال ‪ Client‬التصال بقواعد‬
‫البيانات مستخدما ً تهيئة هذا الملف ‪.‬‬
‫ولنفترض أن المستخدم فى هذا ال ‪ Client‬كتب العبارة التالية ‪-:‬‬
‫‪CONN USERNAME/PASSWORD@AKSLPNT1‬‬

‫فإن ال ‪ Client‬سيترجم كلمة ‪ AKSLPNT1‬على النحو التالى ‪-:‬‬


‫‪ :HOST‬إسم المخدم الذى يحتوى عل المستمع ‪KASALA-DC‬‬
‫‪:PROTOCOL‬البرتوكول الذى يستعمله وهو ‪.TCP‬‬
‫‪:PORT‬البورت الذى يراقبه المستمع‪.‬‬
‫‪:SERVICE_NAME‬اسم ال ‪ INSTANCE‬التى تريد التصال بها‪.‬‬

‫من الممكن القيام بعمل اختبار لل ‪ Oracle Net Service aliases‬بواسطة المر‬
‫‪ tnsping‬ثم بعده نكتب السم المستعار ‪. aliases‬‬

‫‪145‬‬
‫لقد تمت عملية الختبار بنجاح ‪.‬‬

‫‪-:Database Link -2‬‬


‫فى قاعدة البيانات الواحدة يستطيع المستخدمون منح صلحيات على‬
‫الكائنات التى يملكها لغيره من المستخدمين ‪ ،‬أما إذا كان لديك اكثر من قاعدة‬
‫بيانات فمن المتعذر تعامل المستخدمين بين قاعدة بيانات واخرى ما لم يكن لدينا‬
‫‪ Database Link‬فهى الرابط بين قاعدة بيانات واخرى ‪ ،‬وقد تحتاج ذلك كثيرا ً اثناء‬
‫عملك فقد يكون لديك اكثر من قاعدة بيانات تحتاج لربطها مع بعض ‪.‬‬

‫ولنفترض أن لدينا قاعدة بيانات تسمى ‪OBAY‬‬

‫;‪SELECT NAME FROM V$DATABASE‬‬

‫واخرى تسمى ‪.ORCL‬‬

‫‪146‬‬
‫نحتاج الن ربط قاعدة البيانات ‪ OBAY‬مع قاعدة البيانات ‪، ORCL‬‬
‫ولنفترض أن المستخدم ‪ TEST‬فى قاعدة البيانات ‪ OBAY‬يحتاج لعمل استعلم‬
‫على الجدول ‪ EMPLOYEE‬المملوك للمستخدم ‪ VBS‬الموجود فى قاعدة البيانات‬
‫‪ ، ORCL‬إذا ً نحتاج لعمل ‪ Database Link‬بين المستخدم ‪ TEST‬فى قاعدة البيانات‬
‫‪ OBAY‬وبين المستخدم ‪ VBS‬فى قاعدة البيانات ‪.ORCL‬‬

‫لكن قبل إنشاء ال ‪ Database Link‬لبد من الشارة إلى أن المستخدم الذى‬


‫يقوم بإنشاء ال ‪ Database Link‬لبد أن يكون لديه الصلحية ‪CREATE DATABASE‬‬
‫‪.LINK‬‬
‫والن المستخدم ‪ TEST‬فى قاعدة البيانات ‪ OBAY‬سيقوم بعمل ‪Database‬‬
‫‪ Link‬بينه وبين المستخدم ‪ VBS‬فى قاعدة البيانات ‪.ORCL‬‬

‫او ً‬
‫ل‪ :‬يتصل المستخدم ‪ TEST‬ويتأكد أن لديه الصلحية ‪CREATE DATABASE‬‬
‫‪.LINK‬‬

‫‪SELECT * FROM USER_SYS_PRIVS WHERE‬‬


‫;'‪PRIVILEGE='CREATE DATABASE LINK‬‬

‫فى الخطوة السابقة تأكدنا اول ً أننا نعمل على قاعدة البيانات ‪OBAY‬‬
‫وتأكدنا ثانيا ً أن المستخدم ‪ TEST‬يملك الصلحية ‪.CREATE DATABASE LINK‬‬

‫‪147‬‬
‫ثانيا ً‪ :‬يقوم المستخدم ‪ TEST‬بإختبار ال ‪ Oracle Net Service aliases‬الموجودة فى‬
‫ملف ال ‪ tnsnames.ora‬وذلك للتأكد من سلمة التصال بقاعدة البيانات الخرى وهى‬
‫هنا ‪. ORCL‬‬

‫لقد تمت عملية الختبار بنجاح‪.‬‬

‫ثالثاً يقوم المستخدم ‪ TEST‬بإنشاء ال ‪.Database Link‬‬

‫‪CREATE DATABASE LINK TESTVBS CONNECT TO VBS‬‬


‫;'‪IDENTIFIED BY VBS USING 'ORCL‬‬
‫لقد قام المستخدم ‪ TEST‬بإنشاء ‪ Database Link‬تسمى ‪ TESTVBS‬يستطيع من‬

‫خللها المستخدم ‪ TEST‬التصال بالمستخدم ‪ VBS‬الموجود فى قاعدة بيانات اخرى‬


‫تسمى ‪.ORCL‬‬

‫رابعا ً الن يمكن المستخدم ‪ TEST‬الستعلم عن الجدول ‪ EMPLOYEE‬المملوك‬


‫للمستخدم ‪ VBS‬الموجود فى قاعدة البيانات ‪.ORCL‬‬

‫;‪SELECT * FROM EMPLOYEE@TESTVBS‬‬

‫‪148‬‬
‫فى بعد الحيان يكون اسم ال ‪ Database Link‬مصحوبا ً بإسم الجدول طويل‬
‫فمن الفضل إنشاء مرادف ‪ synonym‬لتسهيل واختصار كتابة العبارات‬
‫خصوصا ً تلك التى يتكرر كتابتها‪.‬‬

‫;‪CREATE SYNONYM EMP FOR EMPLOYEE@TESTVBS‬‬

‫لكن يجب مراعاة أن المستخدم يحتاج للصلحية ‪ CREATE SYNONYM‬لنشاء‬


‫المرادف‪.‬‬

‫الن يمكن كتابة عبارة الستعلم بالشكل التى‪:‬‬

‫;‪SELECT * FROM EMP‬‬

‫تجدر الشارة هنا بأن نقول انك تستطيع من خلل ال ‪ Database Link‬إجراء عمليات‬
‫ال ‪ DML‬وهى )‪ ( SELECT & INSERT & UPDATE &DELETE‬لكن من المتعذر‬
‫اجراء عمليات ال ‪ DDL‬مثل ‪.CREATE & ALTER & DROP‬‬

‫‪:PUBLIC DATABASE LINK‬‬


‫ما قمنا به فى الخطوات السابقة هو ربط المستخدم ‪ TEST‬فى قاعدة‬
‫البيانات ‪ OBAY‬مع المستخدم ‪ VBS‬فى قاعدة البيانات ‪ ORCL‬عن طريق‬
‫‪ DATABASE LINK‬تسمى ‪.TESTVBS‬‬

‫‪149‬‬
‫لكن هل يستطيع اى مستخدم اخر فى قاعدة البيانات ‪ OBAY‬استخدام‬
‫‪ TESTVBS DATABASE LINK‬؟ الجواب وبكل سهولة ل ‪ ،‬وذلك لن ال ‪Database‬‬
‫‪ Link‬التى قمنا بخلقها هى خاصة بالمستخدم ‪ TEST‬وليست لكل المستخدمين‬
‫وهى تسمى ‪.PRIVATE DATABASE LINK‬‬

‫ولكى يستطيع كل المستخدمون فى قاعدة البيانات ‪ OBAY‬التصال‬


‫بالمستخدم ‪ VBS‬فى قاعدة البيانات ‪ ORCL‬نحتاج لنشاء ‪PUBLIC DATABASE‬‬
‫‪.LINK‬‬

‫بالطبع لنشاء هذا النوع نحتاج للصلحية ‪.CREATE PUBLIC DATABASE LINK‬‬

‫قام مدير قاعدة البيانات بمنح المستخدم ‪ TEST‬الصلحية ‪CREATE‬‬


‫‪ PUBLIC DATABASE LINK‬ومن ثم قام المستخدم ‪ TEST‬بإنشاء ‪PUBLIC‬‬
‫‪ DATABASE LINK‬تسمى ‪ ، PUBTESTVBS‬الن يستطيع جميع المستخدمين فى‬
‫قاعدة البيانات ‪ OBAY‬استخدم ‪.PUBTESTVBS DATABASE LINK‬‬

‫للستعلم عن ال ‪ DATABASE LINK‬فى قاعدة البيانات‬


‫‪DBA_DB_LINKS‬‬
‫‪USER_DB_LINKS‬‬

‫‪150‬‬
ALL_DB_LINKS
V$DBLINK

SELECT DB_LINK FROM DBA_DB_LINKS;

.DATABASE LINK ‫بالطبع يمكن حذف ال‬

DROP DATABASE LINK TESTVBS;

PUBLIC DATABASE LINK ‫كما يمكن حذف ال‬

DROP PUBLIC DATABASE LINK PUBTESTVBS;

151
‫بالطبع نحتاج للصلحية ‪ DROP PUBLIC DATABASE LINK‬للحذف‪.‬‬

‫‪-:Materialized Views -3‬‬

‫عند مناقشتنا لل ‪ Database Link‬عرفنا كيف يمكن ربط قاعدة بيانات بأخرى‬
‫وكيف يمكن الوصول للكائنات فى قاعدة بيانات من قاعدة بيانات اخرى ‪ ،‬ولكن قد‬
‫تحتاج فى بعض الحيان لنقل وتحديث البيانات الموجودة فى قاعدة البيانات الى‬
‫قاعدة بيانات أخرى ‪.‬‬

‫كأن تكون مثل ً مديرا ً لمجموعة صيدليات ؛ كل صيدلية تحتوى على قاعدة‬
‫بيانات ولكن على رأس كل ساعة تحتاج لجلب جميع حسابات الصيدليات من قواعد‬
‫البيانات الموزعة الى قاعدة البيانات الرئيسية ‪ ،‬هذه هى مهمة ال ‪Materialized‬‬
‫‪ Views‬؛ ولكن لل ‪ Materialized Views‬مهام اخرى ليست هنا مجال تفصيلها‪.‬‬

‫سنستخدم هنا نفس المثال الذى استخدمناه فى ال ‪، Database Link‬‬


‫ولنفترض هنا أن قاعدة البيانات ‪ OBAY‬هى قاعدة البيانات الرئيسية التى‬
‫ستستقبل البيانات ‪ ،‬ولنفترض أننا سنستقبل البيانات فى المستخدم ‪ ، TEST‬أما‬
‫قاعدة البيانات الخرى ‪ ORCL‬والتى تحتوى على الجدول الرئيسى ولنفترض أنه‬
‫‪ EMPLOYEE‬المملوك للمستخدم ‪ VBS‬الذى نحتاج الى نقل وتحديث بياناته كل‬
‫ثانية الى قاعدة البيانات الرئيسية ‪.OBAY‬‬

‫بالطبع نحتاج قبل كل شئ لعمل ‪ Database Link‬بين المستخدم ‪ TEST‬فى‬


‫قاعدة البيانات ‪ OBAY‬وبين المستخدم ‪ VBS‬فى قاعدة البيانات ‪ ، ORCL‬وذلك‬
‫لعملية نقل وتحديث بيانات الجدول ‪ EMPLOYEE‬من قاعدة البيانات ‪ ORCL‬إلى‬
‫قاعدة البيانات ‪.OBAY‬‬

‫أيضا ً عملية تحديث البيانات )‪ (Refresh‬بين الجدول الرئيسى وال ‪Materialized‬‬


‫‪ Views‬تنقسم الى ثلث أنواع ‪:‬‬
‫‪ -:REFRESH FAST -1‬فى هذا النوع من التحديث يتم فقط نقل البيانات التى‬
‫تغيرت بعد اخر تحديث فهو ل يحتاج لنقل جميع البيانات ف الجدول وانما فقط ما‬
‫تم تغيره بعد اخر تحديث ‪ ،‬هذا النوع بفى الغالب يختصر الزمن ‪.‬‬

‫‪152‬‬
‫‪ :REFRESH COMPLETE -2‬أما فى هذا النوع من التحديث يقوم بنقل جميع‬
‫بيانات الجدول من المصدر الى ال ‪ Materialized Views‬فيقوم بعمل إعادة كتابة‬
‫البيانات القديمة واضافة البيانات الجديدة‪ .‬ف الغالب ان هذا النوع يتطلب زمن‬
‫اكثر من النوع ‪.FAST‬‬

‫‪ :REFRESH FORCE -3‬هذا النوع بيدأ اول بتطبيق النوع ‪ FAST‬إذا فشلت‬
‫العملية كأن لم يجد مثل ً ال ‪ Materialized Views Logs‬فى جانب المصدر‪ .‬ففى هذه‬
‫الحالة يطبق النوع ‪.COMPLETE‬‬

‫إذا لم يحدد نوع التحديث اثناء إنشاء ال ‪ Materialized Views‬فان الصل‬


‫‪ DEFAULT‬هو ‪.FORCE‬‬

‫‪-:Materialized Views Logs‬‬


‫كما سبق وان ذكرنا أن نوع التحديث ‪ FAST‬يقوم فقط بنقل البيانات التى‬
‫تم تغيرها منذ اخر تحديث من الجدول المصدر الى ال ‪ .Materialized Views‬ولكن‬
‫أين يتم تخزين معلومات عن البيانات التى تغيرت فى الجدول المصدر قبل نقلها‬
‫الى ال ‪ Mataerialized Views‬؟ الجواب يتم تخزينها فى ال ‪Materialized View Logs‬‬
‫‪ ،‬وهو عبارة عن جدول يتم إنشاؤه فى قاعدة البيانات بل وفى المستخدم الذى‬
‫يملك الجدول المصدر وذلك عن طريق المر التالى ‪:‬‬

‫;‪CREATE MATERIALIZED VIEW LOG ON EMPLOYEE‬‬

‫بحيث ‪ EMPLOYEE‬هو الجدول المصدر‪.‬‬

‫فلحظة كتابة المر اعله ؛ قاعدة البيانات تقوم بإنشاء جدول بالصيغة‬
‫‪<MLOG$_<TABLE_NAME‬‬

‫‪:Primary Key Materialized Views‬‬


‫ولكن حتى تستطيع تنظيم الجدول المصدر ‪ ،‬دون التأثير على ال ‪FAST‬‬
‫‪ REFRESH‬وذلك بحيث يتم حفظ التغيرات بناًء على ال ‪ ، Primary Key‬فنستطيع‬
‫لحظة إنشاء ال ‪ Materialized Views‬تحديد الخيار ‪ WITH PRIMARY KEY‬وهو‬
‫الصل ‪ DEFAULT‬فى حالة عدم تحديد خيار اخر ‪ ،‬والخيار الخر هو ‪.ROWID‬‬

‫‪153‬‬
‫لحظة إنشاء ال ‪ Materialized Views‬بالخيار ‪ Primary Key‬يجب أن يكون الجدول‬
‫المصدر يحتوى على ‪.prmary Key Constraint‬‬

‫كذلك عند تحديد الخيار ‪ Fast Refresh‬عند إنشاء ال ‪ Materialized Views‬يجب‬


‫أن نكون قمنا بإنشاء ال ‪ Materialized View Logs‬فى المستخدم الذى يحوى‬
‫الجدول المصدر وإل ظهرت لنا رسالة خطأ‪.‬‬

‫قد يكون فى الشرح السابق نوع من التعقيد لكن ل عليك ركز معى فى‬
‫السناريو الذى سننفذه معا ً خطوة خطوة ابتداًء من إنشاء المستخدمين وحتى عمل‬
‫ال ‪ Materialized Views‬وهذا هو بيت القصيد‪.‬‬

‫قاعدة البيانات الولى تسمى ‪ ، OBAY‬سنقوم بإنشاء مستخدم فيها يسمى‬


‫‪ MAIN‬؛ وسنقوم بإنشاء ‪ Materialized Views‬فى هذا المستخدم لجلب بيانات‬
‫موجودة فى الجدول ‪ EMPLOYEE‬المملوك للمستخدم ‪ SUB‬الموجود فى قاعدة‬
‫البيانات ‪.ORCL‬‬
‫واليك الخطوات ‪-:‬‬
‫‪ -1‬سنقوم بإنشاء المستخدم ‪ MAIN‬فى قاعدة البيانات ‪ OBAY‬وسنمنحه‬
‫الصلحيات الكافية‪.‬‬

‫;‪CREATE USER MAIN IDETIFIED BY MAIN‬‬

‫‪GRANT CONNECT,RESOURCE,CREATE DATABASE‬‬


‫;‪LINK,CREATE MATERIALIZED VIEW TO MAIN‬‬

‫‪ -2‬فى الجانب الخر نتأكد من الجدول المصدر وهو هنا ‪ EMPLOYEE‬والتأكد كذلك‬
‫أنه يحتوى على ‪ PRIMARY KEY CONSTRAINT‬حتى نستطيع إنشاء‬

‫‪154‬‬
WITH ‫ فى قاعدة البيانات الخرى بإستخدام الخيار‬MATERIALIZED VIEWS
.PRIMARY KEY

SELECT * FROM EMPLOYEE;


CONSTRAINT ‫ يحتوى على حقلين ويحتوى كذلك على‬EMPLYEE ‫إذا ً الجدول‬
SELECT
OWNER,CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME
FROM USER_CONSTRAINTS;
.PRIMARY KEY

‫ بين‬DATABASE LINK ‫ نقوم بإنشاء‬OBAY ‫ الن فى قاعدة البيانات‬-3


.ORCL ‫ فى قاعدة البيانات‬SUB ‫ وبين المستخدم‬MAIN ‫المستخدم‬

CREATE DATABASE LINK MAINSUB CONNECT TO SUB


IDENTIFIED BY SUB USING 'ORCL';

155
‫ الذى يحوى الجدول المصدر‬SUB ‫ وفى المستخدم‬ORCL ‫ فى قاعدة البيانات‬-4
.MATERIALIZED VIEW LOG ‫ نقوم بإنشاء‬EMPLOYEE

CREATE MATERIALIZED VIEW LOG ON EMPLOYEE;

‫ ويمكن التحقق‬EMPLOYEE ‫ للجدول‬MATERIALIZED VIEW LOG ‫قمنا بإنشاء‬


‫ بالستعلم‬EMPLOYEE ‫ للجدول‬MATERIALIZED VIEW LOG ‫من إنشاء ال‬
‫التالى‬

SELECT * FROM TAB WHERE TNAME LIKE '%EMPLOYEE';


.MATERIALIZED VIEW ‫ نقوم بإنشاء ال‬OBAY ‫ فى قاعدة البيانات‬-5

CREATE MATERIALIZED VIEW EMPLOYEE_MV


REFRESH FAST
START WITH SYSDATE
NEXT SYSDATE + 1/(24*60*60)
WITH PRIMARY KEY
AS SELECT * FROM EMPLOYEE@MAINSUB;

156
‫قمنا بإنشاء ال ‪ MATERIALIZED VIEW‬مستخدمين الخيار ‪FAST‬‬
‫‪ REFRESH‬وذلك لننا قمنا بإنشاء ال ‪ MATERIALIZED VIEW LOG‬فى الجانب‬
‫الخر وإل ظهرت رسالة خطأ ‪ ،‬وكذلك استخدمنا الخيار ‪WITH PRIMARY KEY‬‬
‫وذلك لن الجدول المصدر يحتوى على ‪ ، PRIMARY KEY CONSTRAINT‬على اى‬
‫حال هناك خيار اخر هو ‪.WITH ROWID‬‬

‫‪ -6‬الن يمكن الستعلم عن الجدول المصدر وال ‪MATERIALIZED VIEW‬‬


‫ستلحظ أنه كل ثانية كما حددنا ذلك ]‪[SYSDATE +1/(24*60*60‬تكون النتيجة‬
‫متطابقة بين الجدول المصدر ‪ EMPLOYEE‬وبين ال ‪MATERIALIZED VIEW‬‬
‫وهى ‪.EMPLOYEE_MV‬‬

‫;‪SELECT * FROM EMPLOYEE‬‬

‫‪157‬‬
‫;‪SELECT * FROM EMPLOYEE_MV‬‬

‫‪ -7‬الن لو قمنا بإضافة حقل جديد فى الجدول المصدر ثم بعد ذلك أعدنا عمليات‬
‫الستعلم اعله‪.‬‬

‫;)’‪INSER INTO EMPLOYEE VALUES (3,’ALI‬‬

‫لحظت معى إضافة حقل ثالث فى الجدول ‪.EMPLOYEE‬‬

‫‪158‬‬
‫ستنعكس الضافة فى الجدول المصدر ‪ EMPLOYEE‬على ‪EMPLOYEE_MV‬‬
‫‪ MATERIALIZED VIEW‬بعد ثانية واحدة من الضافة فى الجدول المصدر‪.‬‬

‫لو قمنا بعمل إستعلم للجدول ‪ MLOG$_EMPLOYEE‬قبل عملية ال ‪REFRESH‬‬


‫سنجد معلومات عن الحقول التى اضيفت بعد اخر عملية ‪ REFRESH‬ولكن بعد‬
‫عملية ال ‪ REFRESH‬تختفى المعلومات السابقة عن الجدول وفى إنتظار الجديد‪.‬‬

‫يستطيع مدير قاعدة البياناات عمل إستعلم عن ال ‪MATERIALIZED VIEWS‬‬


‫التى تعمل فى قاعدة البيانات بواسطة الجدول‬
‫‪DBA_MVIEWS‬‬

‫‪159‬‬
‫نستطيع أن نحصل على معلومات اخرى من نفس الجدول‪.‬‬
‫للستعلم عن ال ‪ JOBS‬بواسطة الجدول ‪.DBA_JOBS‬‬

‫بالطبع المستخدم ‪ MAIN‬يستطيع حذف ال ‪.MATERIALIZED VIEW‬‬

‫;‪DROP MATERIALIZED VIEW EMPLOYEE_MV‬‬

‫‪160‬‬
161
162
‫‪:UNDO MANAGEMENT -1‬‬
‫فى الفصل الثالث من هذا الكتاب تحدثت عرضا ً عن ال ‪Undo Tablespace‬‬
‫وذكرت أنه يستخدم من قبل ال ‪ Oracle Server‬لتخزين ال ‪، Undo Information‬‬
‫لكن هل فكرت يوما ً فى عملية ال ‪ ROLLBACK‬؟ وهل سألت نفسك كيف يمكنك‬
‫التراجع عن عمليات التعديل التى قمت بها فى بعض الحقول؟ ‪ ،‬رغم أنه تم تغير‬
‫القيم القديمة الى القيم الجديدة ‪.‬‬

‫السناريو بإختصار أنه عند إجراء عملية تعديلت على البيانات فى قاعدة‬
‫البيانات فإن ال ‪ Oracle Server‬يقوم يتخزين القيم القديمة فى ال ‪Undo Tablespace‬‬
‫قبل ان يتم تغييرها بالقيم الجديدة ‪ ،‬هذا السناريو يتيح لنا فرصة التراجع عن‬
‫العمليات متى احتجنا إلى ذلك بشرط أن تكون القيم القديمة ما زالت موجودة فى‬
‫ال ‪ Undo Tablespace‬إذ ل يتصور أن تظل هذه القيم موجودة إلى مالنهاية فهو فى‬
‫اخر المر ‪ Tablespace‬له سعة محدودة وكذلك له فترة احتفاظ بالمعلومات محدودة‬

‫‪163‬‬
‫يقوم بتهيئتها مدير قاعدة البيانات حسب ما يراه مناسبا ً ‪ ،‬نستطيع كذلك من خلل‬
‫هذا السناريو ان ننجز عملية ال ‪ Flashback Queries‬إذا توفرت القيم القديمة‬
‫سنتحدث عن ال ‪ Flashback Queries‬فى هذا الفصل ولكن عموما ً هو عبارة عن‬
‫استعلم عن قيم لكن فى الماضى عند زمن معين ‪.‬‬

‫فى الصدارات السابقة كان يتم تخزين القيم التى تم تعديلها فى قاعدة‬
‫البيانات فى ‪ Rollback Segment‬ولكن بعد الصدار ‪ Oracle9i‬فصاعدا ً قدمت شركة‬
‫اوركل خيار جديد هو ‪ Undo Segment‬مع إبقاء الخيار الول متاحا ً ‪ ،‬ولكن تنصح‬
‫شركة اوركل بقوة استخدام ال ‪.Undo Segment‬‬

‫فال ‪ Undo Tablespace‬تتم إدارته عن طريق ‪Managed Tablespace Locally‬‬


‫وايضا ً ‪ ، Automatic Extent allocation‬فلحظة بدء العملية يتم تخصيص وإنشاء ‪Undo‬‬
‫‪ Segment‬اليا ً لتخزين القيم التى تتغير فى قاعدة البيانات بواسطة هذه العملية ‪،‬‬
‫بحيث يتم تخصيص ‪ Undo Segment‬واحدة لكل عمليات ولكن يمكن أن تخدم هذه‬
‫ال ‪ Segment‬عدد من العمليات‪ ،‬فعند امتلء ال ‪ Extent‬يتم التحول للتى بعدها فى‬
‫نفس ال ‪ Segment‬بحيث يكون على القل هناك اثنين من ال ‪ Extents‬فى كل‬
‫‪ Segement‬أما الحد القصى فيعتمد على ‪ ، DB Block Size‬أما إذا تم ملء جميع ال‬
‫‪ Extents‬فى ال ‪ Undo Segment‬فإنه يتم إعادة الكتابة فى ال ‪ Extent‬إبتداًء من الول‬
‫‪ ،‬أو يتم طلب تخصيص ‪ Extent‬جديدة‪.‬‬

‫قد يكون فى قاعدة البيانات الواحدة اكثر من ‪ Undo Tablespace‬لكن ل‬


‫يمكن ان يعمل فى اللحظة الواحدة اكثر من ‪ Undo Tablespace‬ويتم تحديد عمل‬
‫ال ‪ Undo Tablespace‬فى قاعدة البيانات بواسطة المتغير ‪.Undo_Tablespace‬‬

‫;‪SHOW PARAMETER UNDO_TABLESPACE‬‬

‫لنشاء ‪ Undo Tablespace‬جديد‬

‫‪CREATE UNDO TABLESPACE ORCLUNDO DATAFILE‬‬


‫‪'D:\oracle\product\10.1.0\oradata\ORCL\ORCLUNDO.‬‬
‫‪DBF' SIZE 20M EXTENT MANAGEMENT LOCAL‬‬
‫;‪AUTOALLOCATE‬‬

‫‪164‬‬
‫الن قاعدة البيانات تحتوى على اثنين من ال ‪ Undo Tablespace‬ولكن يعمل‬
‫واحد فقط هو ‪ UNDOTBS1‬كما موضح اعله ‪.‬‬

‫ولكن يمكن تغيير ال ‪ Undo Tablespace‬الذى يعمل فى قاعدة البيانات من‬


‫‪ UNDOTBS1‬الى ‪.ORCLUNDO‬‬
‫'‪ALTER SYSTEM SET UNDO_TABLESPACE='ORCLUNDO‬‬
‫;‪SCOPE=BOTH‬‬

‫قاعدة البيانات اوركل ‪ Oracle Database10g‬تتيح خيار ادرة اليا ً لل ‪Undo‬‬


‫‪ Tablespace‬وهو ‪ Automatic Undo Management‬ويتم تهيئته بواسطة المتغير‬
‫‪ UNDO_MANAGEMENT‬بحيث يأخذ القيمة ‪ ، AUTO‬أما خيار الدارة اليدوى‬
‫‪ Manual Undo Magamenet‬فهو خيار مكلف ويحتاج لعمل اكثر من مدير قاعدة‬
‫البيانات ‪.‬‬
‫أما خيار الدارة ‪ Automatic Undo Management‬فهو يقلل العبء من مدير‬
‫قاعدة البيانات بحيث تكون إدراته فقط على مستوى ال ‪.Tablespace‬‬

‫مدير قاعدة البيانات ينتظره تهيئة المساحة المناسبة لل ‪Undo Tablespace‬‬


‫وذلك حسب المعلومات التى سيتم تخزينها ‪ ،‬كذلك لبد من تهيئة فترة الحتفاظ‬
‫‪ Undo Retention‬للبيانات فى ال ‪ Undo Segment‬وذلك بواسطة المتغير‬
‫‪ UNDO_RETENTION‬الذى يأخذ قيمة هى فترة الحتفاظ بالثوانى ‪.‬‬
‫الصل فى هذا المتغير هو أن يأخذ القيمة ‪ 0‬وهى تعنى ‪ Automatic‬اى يعنى‬
‫محاولة الحتفاظ بالمعومات حتى تنتهى ‪ ،‬على أن يتم الحتفاظ بالمعلومات على‬
‫القل ‪ 15‬دقيقة ‪ ،‬لكن يمكن تحديد قيمة اخرى هى فترة الحتفاظ بالثوانى واقصى‬
‫قيمة هى ‪.232‬‬

‫;‪SHOW PARAMETER UNDO_RETENTION‬‬

‫‪165‬‬
‫وعموما ً ‪ Undo information‬اى المعلومات الموجودة فى ال ‪ Undo Segments‬تنقسم‬
‫الى ثلث حالت ‪-:‬‬
‫‪ :Uncommitted Undo Information -1‬وهى المعلومات التى لم يتم تثبيتها إلى الن‬
‫وذلك لن العمليات مازالت مستمرة ‪ ،‬هذا النوع من المعلومات ل يمكن حذفها‬
‫واعادة الكتابة فيها ‪.‬‬
‫‪ :Committed Undo Information -2‬وهى ل نحتاجها لعمليات مستمرة ‪ ،‬ولكن لن‬
‫فترة الحفاظ لم تنتهى بعد "‪ ،"Unexpired‬هذا النوع من العمليات نحتفظ به قدر‬
‫المكان ما لم يؤدى ذلك لفشل بعض العمليات نتيجة عدم وجود مساحة فى ال‬
‫‪ Undo Tablespace‬فى هذه الحالة يتم اعادة الكتابة فى هذه المعلومات ‪ ،‬ولكن قد‬
‫يقوم مدير قاعدة البيانات بتهيئة ال ‪ Undo Tablespace‬بحيث نضمن عدم مسح‬
‫واعادة الكتابة فيها وذلك باستخدام الخيار ‪.Guaranteeing Undo Retention‬‬

‫هذا الخيار بالطبع غير متاح سواء لل ‪.Undo Tablespace‬‬


‫;‪ALTER TABLESPACE ORCLUNDO RETENTION GUARANTEE‬‬

‫هكذا نضمن عدم مسح المعلومات التى لم تنتهى فترة احتفاظها حتى لو أدى ذلك‬
‫لفشل بعض العمليات لعدم وجود مساحة فى ال ‪.Undo Tablespace‬‬

‫‪ :Expired Undo Information -3‬وهى ل نحتاجها لعمليات مستمرة ‪ ،‬وكذلك فترة‬


‫الحتفاظ بها انتهت فيمكن اعادة الكتابة فيها متى ما احتجنا لمساحة فى ال ‪Undo‬‬
‫‪.tablespace‬‬

‫من المشاكل التى تحدث كثيرا ً والتى يجب لمدير قاعدة البيانات مراعاتها ‪-:‬‬
‫‪ -1‬مشكلة المساحة ‪ :Undo Tablespace Space Error‬ويجب على مدير قاعدة‬
‫البيانات مراقبة مساحة ال ‪ Undo Tablespace‬فالعمليات التى ل تجد مساحة فى ال‬
‫‪ Undo Tablespace‬تعطى رسالة الخطأ‪.‬‬
‫‪ORA-01650: unable to extend rollback segment‬‬

‫‪ :Snapshot too old” Error“ -2‬وهذا الخطأ يظهر عند تنفيذ استعلم يحتاج لمعلومات‬
‫‪ Undo Information‬قد تم مسحها واعادة الكتابة فيها ‪ ،‬لذا يجب على مدير قاعدة‬
‫البيانات مراعاة فترة الحتفاظ المناسبة ‪ UNDO_RETENTION‬وكذلك المساحة‬
‫المناسبة مع مراعاة ‪.Guaranteeing Undo Retention‬‬

‫يمكن الستعلم عن ال ‪ UNDO‬بواسطة‪:‬‬


‫‪DBA_UNDO_EXTENT‬‬
‫‪V$UNDOSTAT‬‬

‫‪166‬‬
:Flashbach Technology -2

:A- Flashback Query


From Oracle91 & Do use Undo

:B- Flashback Table


From Oracle10g & Do use Undo

:C- Flashback Version Query


From Oracle10g & Do use Undo

:D- Flashback Transaction


From Oracle10g & Do use Undo

167
‫‪:E- Flashback Drop‬‬
‫‪From Oracle10g & Do Not use Undo‬‬

‫‪:F- Flashback Database‬‬


‫‪From Oracle10g & Do Not use Undo‬‬

‫‪:A- Flashback Query‬‬


‫هذا النوع متاح منذ الصدار ‪ Oracle9i‬بحيث نستطيع من خلله عمل إستعلم فى‬
‫قاعدة البيانات ليس للبيانات الموجودة حاليا ً وإنما لبيانات موجودة فى لحظة زمنية‬
‫فى الماضى ‪ ،‬ويعتمد هذا النوع اساسا ً على ال ‪ ، Undo Tablespace‬فبمجرد عمل‬
‫الستعلم يتم البحث عن المعلومات فى ال ‪ ، Undo Segments‬هذه المعلومات‬
‫التى ستعرض للمستخدم تظل مؤقتة ومتاحة فقط لل ‪ Session‬الحالية ‪ ،‬بالطبع‬
‫فقد تفشل عملية ال ‪ Flashback Query‬إذا لم نجد البيانات المطلوبة فى ال ‪Undo‬‬
‫‪ Tablespace‬مثل ً بسبب طول المدة وإعادة كتابة بيانات جديدة فى البيانات‬
‫المطلوبة لذا على مدير قاعدة البيانات تحديد فترة احتفاظ ‪ Retention‬مناسبة‪.‬‬

‫ولنتصور الن السناريو التالى حتى نستوعب عملية ال ‪ Flashback Query‬بصورة‬


‫اوضح‪:‬‬
‫لدينا الن جدول يسمى ‪ Employee‬يحتوى على على مجموعة من الحقول‪.‬‬

‫‪168‬‬
‫;‪SELECT * FROM EMPLOYEE‬‬

‫الجدول ‪ EMPLOYEE‬يحتوى الن على ‪ 8‬حقول‪.‬‬

‫لنفترض أن المستخدم قام بمسح بعض الحقول ‪.‬‬

‫;)‪DELETE EMPLOYEE WHERE EMP_NO IN (1,5,7‬‬

‫الن لو قمنا بإستعراض الجدول‪.‬‬

‫بقى لدينا فقط ‪ 5‬حقول ‪.‬‬

‫‪169‬‬
‫ماذا لو قمنا الن بعمل استعلم على الجدول ولكن فى فترة زمنية فى الماضى‬
‫ولنفترض انها قبل ‪ 20‬دقائق ‪.‬‬
‫بالطبع سيبحث عن هذه المعلومات فى ال ‪ Undo segements‬ويقوم بعرضها ‪ ،‬أما‬
‫إذا لم يجدها فستظهر رسالة خطأ‪.‬‬
‫اى هذه المعلومات غير متوفرة حاليا ً فى ال ‪.Undo Tablespace‬‬

‫‪SELECT * FROM EMPLOYEE AS OF TIMESTAMP‬‬


‫‪TO_TIMESTAMP ('11-06-08:03-33-38','DD-MM-‬‬
‫;)'‪YY:HH24-MI-SS‬‬

‫هذه هى نتيجة الستعلم ‪ ،‬عرض ‪ 8‬حقول ‪ ،‬لكن ما هو متاح حاليا ً هو ‪ 5‬حقول‬


‫فقط‪.‬‬

‫هكذا قمنا بعرض معلومات فى الماضى ‪ ،‬لكن ماذا لو أردنا أن نأتى بهذه‬
‫المعلومات فى الحاضر أى تظل هذه المعلومات موجودة فى الجدول ‪ ،‬يمكن أن‬
‫ننشئ جدول جديد من المعلومات المستعرض ومن ثم نقوم بحذف الجدول‬
‫‪ Employee‬وإعادة تسمية الجدول الجديد الى ‪.Employee1‬‬

‫‪CREATE TABLE EMPLOYEE1 AS (SELECT * FROM‬‬


‫‪EMPLOYEE AS OF TIMESTAMP TO_TIMESTAMP('11-06-‬‬
‫;))'‪08:03-33-38','DD-MM-YY:HH24-MI-SS‬‬
‫‪170‬‬
‫الن نقوم بحذف الجدول ‪.Employee‬‬

‫;‪DROP TABLE EMPLOYEE‬‬

‫ثم نقوم بإعادة تسمية للجدول ‪ EMPLOYEE1‬إلى ‪.EMPLOYEE‬‬

‫الن الجدول ‪ EMPLOYEE‬يحتوى على المعلومات التى كانت به منذ ‪ 20‬دقيقة‪.‬‬

‫فى الخطوات السابقة قمنا بعمل استعلم فى ‪ Session‬معينة عن بيانات فى‬


‫لحظة معينة فى الماضى ‪ ،‬ولكن من الممكن كذلك أن نضع كل هذه الٍ‪Session‬‬
‫فى لحظة معينة من الماضى ‪ ،‬بحيث تكون نتيجة جميع الستعلمات لقاعدة‬
‫البيانات من خلل هذه الٍ‪ Session‬فى نقطة معينة من الماضى يتم تحديدها اثناء‬
‫عمل ال ‪ ، Flashback‬ولكن باقى الٍ‪ Sessions‬التى تعمل على قاعدة البيانات ترى‬
‫قاعدة البيانات فى الوقت الحقيقى الن ؛ ما عدا هذه ال ‪ Session‬التى ترى قاعدة‬
‫البيانات فى لحظة معينة من الماضى ‪ ،‬يتم ذلك من خلل الحزمة‬
‫‪.DBMS_FLASHBACK‬‬

‫للرجوع بال ‪ Session‬الحالية للماضى يوما ً كامل ً نقوم بتنفيذ الجراء ‪PROCEDURE‬‬
‫‪ ENABLE_AT_TIME‬الموجود فى الحزمة ‪PACKAGE DBMS_FLASHBACK‬‬

‫‪DECLARE‬‬
‫;‪QUERY_TIME TIMESTAMP‬‬
‫‪BEGIN‬‬
‫;)‪QUERY_TIME := TO_TIMESTAMP(SYSDATE -1‬‬
‫‪SYS.DBMS_FLASHBACK.ENABLE_AT_TIME ( QUERY_TIME‬‬
‫;)‬
‫;‪COMMIT‬‬
‫‪171‬‬
‫;‪END‬‬
‫‪/‬‬
‫هكذا خلل هذه ال ‪ Session‬جميع الستعلمات ترى قاعدة البيانات كما لو كنا‬
‫بالمس‪.‬‬

‫لبد من الشارة إلى أنه من خلل هذا النمط ل يمكن إجراء عمليات ال ‪DML‬‬
‫ماعدا ‪.SELECT‬‬

‫يمكن إلغاء هذا النمط بواسطة الجراء ‪ DISABLE‬الموجود فى الحزمة‬


‫‪DBMS_FLASHBACK‬‬

‫هكذا قمنا بإلغاء النمط ‪.Flashback‬‬

‫‪172‬‬
‫‪:B- Flashback Table‬‬
‫ويسمى ايضا ً ‪ Flashback Table Query‬واستحدث هذا النوع فى الصدار‬
‫‪ Oracle10g‬ويعتمد اساسا ً على ال ‪ ، Undo Tablespace‬وهو الرجوع بالجدول الى‬
‫فترة زمنية فى الماضى ويعتمد اساسا ً الى الذهاب الى ال ‪ Undo Segments‬وارجاع‬
‫الجدول الى لحظة معينة فى الماضى مستفيدا من المعلومات الموجودة ‪Undo‬‬
‫‪ ، Segments‬فقد تكون جرت على الجدول عدد من التعديلت سنجدها فى ال ‪Undo‬‬
‫‪ ، Tablespace‬بالطبع قد تفشل عملية ال ‪ Flashback Table‬إذا لم نجد المعلومات‬
‫المطلوبة فى ال ‪ Undo Tablespace‬نتيجة لنتهاء فترة الحتفاظ بالمعلومات‬
‫المطلوبة مث ً‬
‫ل‪.‬‬

‫واليك الن السناريو التالى ‪:‬‬


‫لنفترض ان لدينا جولين الول يسمى ‪ DEPT‬وهو جدول الدارات والثانى يسمى‬
‫‪ EMP‬وهو جدول الموظفين‪.‬‬

‫‪173‬‬
‫فلنستعرض كل الجدولين‪.‬‬

‫;‪SELECT * FROM DEPT‬‬

‫;‪SELECT * FROM EMP‬‬


‫;‬

‫لنضف إدارة جديد فى جدول الدارات ‪.DEPT‬‬

‫;)'‪INSERT INTO DEPT VALUES(3,'FINANCE‬‬

‫ونقوم بإضافة موظف جديد فى جدول الموظفين ‪ EMP‬بحيث ينتمى الموظف‬


‫الجديد للدارة الجديدة‪.‬‬

‫;)‪INSERT INTO EMP VALUES(3,'KHALED',3‬‬

‫‪174‬‬
‫لنقوم بعرض الزمن الن‬

SELECT SYSDATE FROM DUAL;

.Flashback Table ‫نحتاجة لعمل ال‬

ًً ‫الن نقوم بحذف الحقلين ال‬


.‫ذين اضفناهما للجدولين‬

DELETE EMP WHERE EMP_NO=3;


DELETE DEPT WHERE DEPT_NO=3;

‫ إلى ما قبل حذف الحقل‬EMP ‫ للجدول‬Flashback Table ‫الن لنقوم بعمل‬


، EMP_NO=3

FLASHBACK TABLE EMP TO TIMESTAMP


TO_TIMESTAMP('13-06-2008:01-01-06','DD-MM-
YYYY:HH24-MI-SS');

175
‫فشلت عملية السترجاع ‪ Flashback Table‬وذلك لننا نحتاج لعمل ‪Enable Row‬‬
‫‪ ،‬وهو عبار عن ‪ Flag‬يتم وضعه فى ال ‪ Data Dictionary‬ليوضح‬ ‫‪Movement‬‬
‫للوركل عمليات التعديل‪.‬‬

‫;‪ALTER TABLE EMP ENABLE ROW MOVEMENT‬‬

‫قمنا بعمل ‪ Enable Row Movement‬للجدول ‪ ، EMP‬فلنحاول الن عمل ‪Flashback‬‬


‫‪ Table‬للجدول ‪ EMP‬مره اخرى‪.‬‬

‫رسالة خطأ اخرى ‪ ،‬هل عرفت لماذا ؟ لنه قد تم إنتهاك القيد ‪Foreign Key‬‬
‫‪ Constraint‬إذ ل يمكن إعادة الموظف رقم ‪ 3‬الى الجدول ‪ EMP‬وهو ينتمى الى‬
‫الدارة تم حذفها ‘ فهو يبتمى للدارة رقم ‪ 3‬قد تم حذفها ‪ ،‬فما الحل إذًا؟‬

‫الحل ان نقوم بعمل ‪ Flashback Table‬لكل الجدولين ‪.EMP & DEPT‬‬


‫لكن ل تنسى أن تقوم بعمل ‪.Enable Row Movement‬‬

‫‪FLASHBACK TABLE EMP,DEPT TO TIMESTAMP‬‬


‫‪TO_TIMESTAMP('13-06-2008:01-01-06','DD-MM-‬‬
‫;)'‪YYYY:HH24-MI-SS‬‬

‫‪176‬‬
‫لقد تمت عملية ال ‪ Flashback Tables‬بنجاح وليس ضروريا ً أن نقوم بترتيب‬
‫الجدول فى عبارة ال ‪ Flashback‬وذلك لن القيود ‪ Constraint‬يتم التأكد منها بعد‬
‫نهاية العملية ‪.Transaction‬‬

‫ملحظة ‪ :‬لو فشلت محاولة استرجاع جدول ‪ Flashback Table‬فى اى عملية‬


‫فإن العملية تتوقف ومن ثم يتم التراجع ‪ ROLLBACK‬عن العملية كلها ‪ ،‬اى لو‬
‫نجحت عملية استرجاع الجدول ‪ DEPT‬فى العملية السابقة ولكن فشلت عملية‬
‫استرجاع الجدول ‪ EMP‬فإن العملية برمتها ستفشل ويتم التراجع عن العملية كلها‪.‬‬

‫كما ل حظت عملية ال ‪ Flashback Table‬لسيت مضمونة النجاح ‪ ،‬فقد تفشل‬


‫فى احد السبابا التالية ‪-:‬‬
‫‪ -1‬إذا تم انتهاك احد القيود ‪.Constraint Violated‬‬
‫‪ -2‬إذا لم يتم عمل ‪ Enable Row Movement‬للجدول المطلوب استرجاعه‪.‬‬
‫‪ -3‬إذا لم تتوفر المعلومات المطلوبة فى ال ‪:Undo Tablespace ، ORA-08180‬‬
‫‪”no snapshot found based on specified time‬‬
‫‪ -4‬ل يمكن عمل ‪ Flashback Table‬لجدول فى ‪.Sys Schema‬‬

‫‪:C- Flashback Versions Query‬‬


‫قد تحتاج احيانا ً كمدير لقاعدة بيانات لمراقبة بعض التعديلت على الحقول‬
‫فتحتاج لمعرفة القيم التى اخذها حقل معين لفترات تاريخية معينة ‪ ،‬فمثل قد‬
‫تتحول مرتبات الموظفين كل فترة فيتم تعديل ملف ال ‪ Salary‬كل فترة زمنية ‪،‬‬
‫ولكن لنفترض أننى احتاج لمعرفة ال ‪ History‬او القيم السابقة للمرتب لموظف‬
‫معين منذ أن تم تعينة ‪ ،‬فكل ما هو متاح لى فى الجدول الن هو اخر قيمة للمرتب‬
‫الحالى‪.‬‬
‫ً‬
‫وقد استحدث هذا النوع فى الصدار ‪ Oracle10g‬ويعتمد اساسا على ال ‪Undo‬‬
‫‪ .Tablespace‬بحيث ياتى بالمعلومات التى يريدها من ال ‪ Undo Segments‬بعد أن‬
‫نحدد له الفترة الزمنية المحددة أو عن طريق ‪.(System Change Number (SCN‬‬

‫‪177‬‬
‫‪SELECT SALARY,VERSIONS_XID AS‬‬
‫‪XID,VERSIONS_STARTSCN,VERSIONS_ENDSCN,VERSIONS_O‬‬
‫‪PERATION FROM SALARY VERSIONS BETWEEN SCN‬‬
‫;‪MINVALUE AND MAXVALUE WHERE EMP_NO=1‬‬

‫لحظ معى قيمة المرتب ابتداًء كانت ‪ 1000‬وكانت نتيجة عمل ‪ Insert‬كما‬
‫هو موضح بالحرف ‪ ، I‬بعد ذلك تم تعديلها الى القيمة ‪ 1500‬نتيجة عمل ‪Update‬‬
‫كما هو موضح بالحرف ‪ ،U‬وايضا ً تم تعديله مرة اخرى الى القيمة ‪ 2000‬بواسطة‬
‫المر ‪ Update‬كما هو موضح بالحرف ‪.U‬‬

‫لقد قمنا فى المثال السابق بعرض المعلومات مستخدمين ال ‪ ، SCN‬كما‬


‫يمكن إستخدام ال ‪. Timestamp‬‬
‫‪.‬‬

‫ملحظــــــــة‪ :‬ل يتم عرض القيم التى لم يتم تثبيتها ‪.Commited‬‬

‫إذا ً عملية ال ‪ Flashback Versions‬إذا لم تجد الععلومات المطلوبة فى ال‬


‫‪ Undo Tablespace‬فأنها ستفشل ‪ ،‬كما ل يمكن عمل ‪ Flashback Versions‬للجداول‬
‫الخارجية ‪ External Tables‬وكذلك الجداول المؤقتة ‪ Temporary Tables‬وأيضا ً‬
‫المناظير ‪.Views‬‬

‫‪178‬‬
:D- Flashback Transaction
Undo ‫ يتم استخدام ال‬Flashback Table and Flashback versions ‫فى كل من‬
Undo ‫ فإنه يقوم بإسترجاع جميع ال‬Flashback Transaction ‫ أما ال‬، ‫ للكائنات‬Data
‫ اى على مستوى العمليات مهما كانت العمليات مرتبطة بعدد‬Data For transaction
View ‫ نستخدم ال‬Flashback Transaction ‫للستعلم عن ال‬ ، ‫من الكائنات‬
: ‫التالى‬
.FLASHBACK_TRANSACTION_QUERY

DESC FLASHBACK_TRANSACTION_QUERY;

179
‫ حساسة جدا ً لذلك فإن هذا ال‬View ‫ولن البيانات الموجودة فى هذا ال‬
.SELECT ANY TRANSACTION PRIVILEGE ‫ محمى بواسطة الصلحية‬View

‫ولن استعلم جميع العمليات على قاعدة البيانات يأتى بعدد كبير جدا ً من‬
ً ‫ فلو أنى مثل‬، ‫ فمن الفضل التركيز فى الستعلم بواسطة الشروط‬، ‫المعلومات‬
‫أريد استعراض العمليات التى تمت على جدول معين فمن الفضل تحديد الشرط‬
’WHERE TABLE_NAME=’TABLE_NAME

‫ولنفترض الن أنى اريد عمل استعلم عن العمليات التى حدثت على الجدول‬
.SALARY

SELECT START_TIMESTAMP,UNDO_SQL,TABLE_NAME FROM


FLASHBACK_TRANSACTION_QUERY WHERE
TABLE_NAME='DEPT';

.DEPT ‫ على الجدول‬UPDATE ‫لقد تمت عملية‬

XID ‫ اول ً لتحديد‬FLASHBACK VERSIONS ‫ولكن يمكن استخدام ال‬


((Transaction Identifier

SELECT SALARY,VERSIONS_XID AS
XID,VERSIONS_STARTSCN,VERSIONS_ENDSCN,VERSIONS_O
PERATION FROM SALARY VERSIONS BETWEEN SCN
MINVALUE AND MAXVALUE WHERE EMP_NO=1;

180
Flashback ‫ سوف نستخدمها فى ال‬، XID=05001D0057030000 ‫لحظ معى‬
.Transaction Query

SELECT START_TIMESTAMP,UNDO_SQL,TABLE_NAME FROM


FLASHBACK_TRANSACTION_QUERY WHERE
XID=HEXTORAW('05001D0057030000');

FLASHBACK_VERSIONS AND ‫هكذا استخدمنا‬


.FLASHBACK_TRANSACTION

‫ يستخدم لعرض العمليات التى‬FLASHBACK_TRANSACTION ‫وعموما ً فإن ال‬


‫ ويسمى‬، Undo Information ‫حدثت فى قاعدة البيانات ويستخدم هذا النوع ايضا ً ال‬
.FLASHBACK_TRANSACTION_QUERY ً ‫ايضا‬

:E- Flashback Drop


‫ لحظة‬Oracle Database ‫فى الصدارات السابقة من قاعدة البيانات اوركل‬
Data Dictionary ‫ فإنه سوف يزال ايضا ً من ال‬Drop Table ‫عمل حذف للجدول‬
‫ لقاعدة البيانات إذا أردت أن استرجع‬Recovery ‫وسوف نقوم بعمل استرجاع‬

181
‫جدول واحدا ً تم حذفه خطأ ً ‪ ،‬ل شك أنه حل مكلف وملكلف جدا ً من حيث الزمن‬
‫ومن حيث أننا سأفقد بعض العمليات‪.‬‬
‫فعند حذف جدول فى الصدارات السابقة من اوركل يتم تحرير المساحات‬
‫التى كان يستقلها ‪ ،‬أما فى الصدار ‪ Oracle10g‬ل يتم تحرير المساحات التى‬
‫يستقلها الجدول وما يتبعه من كائنات لحظة حذف الجدول ‪ ،‬وإنما يتم وضع‬
‫الجدول مؤقتا ً فى سلة المهملت ‪ RECYCLE BIN‬ويظل الجدول مملوكا ً ايضا ً‬
‫للمستخدم رغم إنتقاله الى سلة المهملت ‪ ،‬ولكن بالطبع لحظة إنتقاله إلى سلة‬
‫المهملت يتم إعادة تسميته حتى ل يحدث تضارب فى السماء إذا أردت أن اقوم‬
‫بإنشاء جدول اخر بنفس السم ‪ ،‬هذا الوضع يتيح لنا فرصة استرجاع الجدول من‬
‫سلة المهملت دون الحوجة لسترجاع قاعدة البيانات ‪ ،‬مما يقلل لنا فترة‬
‫السترجاع وكذلك دون أن نفقد اى عمليات ‪.‬‬

‫بكل بساطة سلة المهملت ‪ RECYCLE BIN‬فى قاعدة البيانات اوركل‬


‫تشبه الى حد كبير سلة المهلت فى نظام التشغيل ويندوز ‪.WINDOWS‬‬

‫يمكن الستعلم عن سلة المهملت ‪ RECYCLE BIN‬بواسطة‪:‬‬


‫‪DBA_RECYCLEBIN‬‬
‫‪USER_RECYCLEBIN‬‬
‫كما يمكن الستعلم عن طريق المر‪:‬‬
‫‪SHOW RECYCLEBIN‬‬

‫والن لننتابع معا ً هذا السناريو‪:‬‬


‫يقوم المستخدم بحذف الجدول ‪ ، USER_MASTER‬ومن ثم نقوم بإستلعم عن‬
‫سلة المهملت ‪.RECYCLE BIN‬‬

‫;‪DROP TABLE USER_MASTER‬‬

‫;‪SHOW RECYCLE BIN‬‬

‫‪182‬‬
‫لحظت معى كيف أنه رغم أننا قمنا بحذف الجدول ‪ USER_MASTER‬إل أن ما زال‬
‫موجودا ً فى سلة المهملت ويمكننا كذلك استرجاعه ‪.‬‬

‫;‪FLASHBACK TABLE USER_MASTER TO BEFORE DROP‬‬

‫لقد قمنا بإسترجاع الجدول من سلة المحذوفات لكن قد تفشل عملية السترجاع‬
‫إذا قمنا بإنشاء جدول بنفس‬
‫السم قبل عملية السترجاع لذلك يمكن اعادة تسميته لتفادى عملية تضارب‬
‫السماء‪.‬‬
‫‪FLASHBACK TABLE USER_MASTER TO BEFORE DROP‬‬
‫;‪RENAME TO MASTER‬‬

‫لقد قمنا بإسترجاع الجدول ولكن بإسم جديد ‪.‬‬

‫;‪SELECT * FROM USER_RECYCLEBIN‬‬


‫‪183‬‬
‫ل يوجد جدول فى سلة المهملت ‪.‬‬
‫يمكن تنظيف سلة المهملت ومسح الجداول من سلة المهملت بواسطة المر‬
‫‪.PURGE‬‬

‫;‪PURGE TABLE MASTER‬‬

‫ل يوجد الن الجدول ‪ MASTER‬فى سلة المهملت ‪.‬‬

‫كذلك يمكن حذف الجدول عن طريق المستخدم دون وضع الجدول فى سلة‬
‫المهملت وانما حذفه مباشرة من قاعدة البيانات بواسطة المر ‪DROP TABLE‬‬
‫‪<TABLE_NAME> PURGE‬‬

‫;‪DROP TABLE EMP PURGE‬‬

‫إذا ً من الحالت التى يتم فيها حذف الجداول من قاعدة البيانات دون المرور بسلة‬
‫المهملت ‪-:‬‬
‫‪ -1‬استخدام المر ‪.DROP TABLE <TABLE_NAME> PURGE‬‬
‫‪ -2‬لحظة حذف ال ‪ TABLESPACE‬الذى يحوى الجداول بواسطة المر‬
‫‪.DROP TABLESPACE <TABLESPACE_NAME> INCLUDING CONTENTS‬‬
‫‪ -3‬عند حذف المستخدم الذى يحوى الجداول بواسطة المر‬
‫‪.DROP USER <USER_NAME> CASCADE‬‬

‫‪:F- Flashback Database‬‬

‫‪184‬‬
‫هل فكرت يوما ً ماذا تفعل لو قمت بحذف مستخدم ٍ ما خطأ ً ؟ الجواب وبكل‬
‫بساطة اقوم بعمل استرجاع لقاعدة البيانات ‪ Recovery‬من النسخ الحتياطى‬
‫‪.Backup‬‬
‫ً‬
‫هذا الحل صحيح ولكن مكلف من حيث الزمن خصوصا إذا كانت قاعدة‬
‫البيانات كبيرة ‪ ،‬فإسترجاع احجام كبيرة من الملفات ل بد أنه مكلف من حيث‬
‫الزمن ‪.‬‬
‫ما الحل إذا ً ‪ ،‬الحل هو ‪.Flashback Database‬‬

‫ال ‪ Flashback Database‬هى إرجاع قاعدة البيانات الى نقطة زمنية معينة فى‬
‫الماضى ‪ ،‬بحيث جميع التعديلت التى حدثت فى قاعدة البيانات من تلك النقطة‬
‫الى الن كأن لم تكن‪.‬‬

‫نستفيد من ال ‪ Flashback Database‬فى حالة حدوث اخطاء منطقية ‪ ،‬كأن‬


‫يحذف مدير قاعدة البيانات مستخدم عن طريق الخطأ أو عمل ‪، Truncate Table‬‬
‫أما الخطاء الفيزيائية كأن نفقد ‪ Data File‬او غيره من الملفات فل نستطيع‬
‫الستفادة من ال ‪ Flashback Database‬وكل ما نستطيعه هو عمل استرجاع للملفات‬
‫من النسخ الحتياطى بالطريقة التقلدية‪.‬‬

‫عملية ال ‪ Flashback Database‬هى عملية سريعة جدا ً للرجوع بقاعدة‬


‫البيانات لفترة زمنية فى الماضى مقارنة بعملية السترجاع من ملفات النسخ‬
‫الحتياطى بالطريقة التقلدية وذلك لننا ل نحتاج ارجاع ملفات النسخ الحتياطى‬
‫لقاعدة البيانات‪.‬‬

‫لحظة عمل ‪ Enable Flashback Database‬يتم إنشاء ‪Background Process‬‬


‫يسمى ‪ (Recovery Writer (RVWR‬ويتم تخصيص جزء فى الذاكرة ‪ SGA‬يسمى‬
‫‪ Flashback Buffer‬ويتم تخصيص جزء من الدسيك لل ‪ Flashback logs‬وهذا الجزء هو‬
‫دائما ً ال ‪. Flash Recovery Area‬‬
‫يكون السناريو بحيث يتم وضع كل ‪ Block‬تم تعديله فى قاعدة البيانات الى‬
‫ال ‪ Flash Buffer‬بعد ذلك يقوم ال ‪ RVWR‬بوضع هذه ال ‪ Blocks‬من ال ‪Flashback‬‬
‫‪ Buffer‬إلى ال ‪. Flashback Logs‬‬

‫هذا السناريو يشبه الى حد كبير سناريو ال ‪ Redo Log Buffer‬وال ‪Redo Log‬‬
‫‪ Files‬ولكن الختلف فى أنه ليس كل التعديلت تكتب فى ال ‪ Flashback Buffer‬كما‬
‫يحدث فى ال ‪ Redo Log Buffer‬وإنما ‪ ، Complete Block Images‬كذلك ال‬
‫‪ Flashback Loges‬ل تتم ارشفته كما يحدث لل ‪.Redo Log Files‬‬

‫كما ذكرت أنه ليست كل التعديلت تكتب فى ال ‪ Flashback Buffer‬وإنما‬


‫‪ ، Complete Block Images‬لذا فإن هناك كثير من التعديلت تحدث ول يتم كتابتها‬
‫مباشرة فى ال ‪ Flashback Buffer‬وإنما يتم تأخيرها وربما تحدثت تعديلت اخرى‬
‫قبل أن تكتب فى ال ‪ ، Flashback Buffer‬ما أرمى اليه أنا أنه قد يتم كتابة‬
‫‪ Complete Block‬وهو يحوى مجموعة مختلفة من التعديلت حدثت فى ازمنة‬
‫مختلفة ‪ ،‬لذا عملية ال ‪ Flashback Database‬لوقت مضبوط هى من الصعوبة بمكان‬

‫‪185‬‬
‫‪ ،‬لذا فإن ال ‪ Flashback Database‬يحتاج لن تكون قاعدة البيانات فى النمط‬
‫‪ Archive Log Mode‬وذلك لن الرشيف يحتوى على جميع تفاصيل التعديلت التى‬
‫حدثت فى قاعدة البيانات على خلف ‪ ، Flashback Logs‬إذا ال ‪ Flashback Logs‬مع‬
‫ال ‪ Archive Logs‬يستطيعان أن ينجحا عملية ال ‪Flashback Database‬‬

‫لتهيئة ال ‪ Flashback Database‬نتبع الخطوات التية‪-:‬‬


‫‪ -1‬التأكد من أن قاعدة البيانات تعمل فى النمط ‪.Archive Log Mode‬‬
‫تحدثنا فى فصول سابقة على أن قاعدة البيانات تعمل على القل على اثنين‬
‫من ‪ Redo Log Files‬وهى ملفات تحوى على التعديلت التى تمت فى قاعدة‬
‫البيانات ‪.‬‬
‫وأن ‪ Background Process LGWR‬يقوم بكتابة التعديلت الموجودة فى ال‬
‫‪ Redo Log Buffer‬ويضعها فى ال ‪ ، Redo Log Files‬وتكون عملية الكتابة بشكل‬
‫دورى بين ال ‪ Redo Log‬ويتم إعادة الكتابة فى ال ‪ ، Redo Logs‬مما يؤدى لفقدان‬
‫البيانات الموجودة فيه لذا كان الحل هو تشغيل قاعدة البيانات فى النمط ‪Archive‬‬
‫‪ Log Mode‬بحيث يتم إنشاء ‪ Background Process‬جديد يسمى ‪ ARCn‬بحيث يقوم‬
‫بعمل نسخ لملفات ال ‪ Redo Log Files‬بحيث ل نفقد البيانات الموجودة فى هذه‬
‫الملفات والتى نعتمد عليها فى عملية السترجاع ‪ Recovery‬؛ والتى بدونها تفشل‬
‫عملية ال ‪.Recovery‬‬

‫لمعرفة هل قاعدة البيانات تعمل فى الوضع ‪ Archive Log Mode‬ام ل؟‬

‫;‪SELECT LOG_MODE FROM V$DATABASE‬‬

‫إذا قاعدة البيانات فى الوضع ‪.No Archive Log‬‬

‫لتهيئة قاعدة البيانات فى الوضع ‪ Archive Log‬نقوم بالخطوات التية‪:‬‬


‫‪ -A‬تحديد المكان الذى سوف نضع فيه الرشيف بواسطة المتغير‬
‫‪ LOG_ARCHIVE_DEST‬مع مراعاة أنه يمكن تحديد ‪ 10‬إتجاهات مختلفة وذلك‬
‫بواسطة المتغيرات ‪ n_LOG_ARCHIVE_DEST‬حيث ‪ n‬تاخذ القيم من ‪ 1‬الى ‪.10‬‬

‫‪ALTER SYSTEM SET‬‬


‫’\‪LOG_ARCHIVE_DEST_1='LOCATION=D:\ARCHIVE‬‬ ‫‪186‬‬
‫;‪SCOPE=SPFILE‬‬
‫كما ذكرت سابقا ً يمكن تحديد اتجاهات اخرى للرشيف ‪ ،‬كما يمكن تهيئة متغيرات‬
‫اخرى لكنها غير ضرورية مثل ً ‪ LOG_ARCHIVE_FORMAT‬هذا المتغير لتحديد‬
‫الفورمات التى يخرج بها ملف الرشيف ‪ ،‬فى الصل يأخذ القيمة ‪.‬‬

‫حيث‪-:‬‬

‫‪ -B‬نغلق قاعدة البيانات ونفتحها فى الوضع ‪ ، Mount‬ثم ننفذ المر ‪ALTER‬‬


‫‪.DATABASE ARCHIVELOG‬‬

‫;‪ALTER DATABASE ARCHIVELOG‬‬

‫‪187‬‬
. ARCHIVELOG MODE ‫الن قاعدة البيانات تعمل فى النمط‬

:‫ بواسطة‬ARCHIVELOG MODE ‫يمكن الستعلم ايضا ً عن عمل‬

SELECT ARCHIVER FROM V$INSTANCE;

REDO LOG FILE ‫ يتم عمل نسخ لملف ال‬SWITCH LOGFILE ‫لحظة عمل‬
.‫للرشيف‬

ALTER SYSTEM SWITCH LOGFILE;

‫كما يمكن الستعلم عن ملفات الرشيف‬

SELECT NAME FROM V$ARCHIVED_LOG;

.‫هذه هى ملفات الرشبف‬

:Flash Recovery Area ‫ تهيئة ال‬-2


Flash Recovery Area ‫ ل تتم إدارته إلى فى ال‬Flashback Logs ‫ذكرت سابقا ً أن ال‬
‫ ويتم‬DB_RECOVERY_FILE_DEST ‫وهى مكان يتم تخصيصة بواسطة المتغير‬
‫تحديد مساحة هذا المكان المخصص بواسطة هذا المتغير‬
‫ يلزمنا‬Flash Recovery Area ‫ إذا ً لتهيئة ال‬، DB_RECOVERY_FILE_DEST_SIZE

ALTER SYSTEM SET 188


DB_RECOVERY_FILE_DEST=’D:\ORACLE\PRODUCT\10.1.0\
FLASH_RECOVERY_AREA;
DB_RECOVERY_FILE_DEST_SIZE) ‫تهيئة المتغيران‬
( & DB_RECOVERY_FILE_DEST

ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=2G;

:Flashback Log ‫ تحديد فترة الحتفاظ بال‬-3


‫وذلك قبل أن يتم استخدامه وإعادة الكتابة فيه مرة اخرى ويتم تحديد ذلك‬

SHOW PARAMETER DB_RECOVERY_FILE_DEST;

ALTER SYSTEM SET


DB_FLASHBACK_RETENTION_TARGET=1440;

‫ وهو زمن الحتفاظ‬DB_FLASHBACK_RETENTION_TARGET ‫بواسطة المتغير‬


.‫بالدقائق والصل أن يتم الحتفاظ لمدة يوم‬

:Mount ‫ اغلق وفتح قاعدة البيانات فى الوضع‬-4

ALTER DATABASE FLASHBACK ‫ بواسطة المر‬Flashback ‫ومن ثم تمكين ال‬


ON

189
ALTER DATABASE FLASHBACK ON;

.Flashback ‫هكذا انتهينا من تهيئة ال‬

:‫ نقوم بعمل الستعلم التى‬Flashback ‫للتأكد من تهيئة ال‬

SELECT FLASHBACK_ON FROM V$DATABASE;

Flashback ‫لمراقبة ال‬

SELECT * FROM V$FLASHBACK_DATABASE_LOG;

190
‫لمعرفة كيفية استخدام ال ‪ Flashback Database‬نتابع معا ً هذا السناريو‪:‬‬
‫‪ -1‬مدير قاعدة البيانات قام بحذف المستخدم ‪ TEST‬عن طريق الخطأ‪.‬‬

‫;‪DROP USER TEST CASCADE‬‬

‫الن ل يوجد مستخدم اسمه ‪ TEST‬فى قاعدة البيانات‪.‬‬

‫‪ -2‬اغلق قاعدة البيانات وفتحها فى الوضع ‪ Mount‬ومن ثم عمل ‪Flashback‬‬


‫‪ Database‬للزمن ‪ 54-55-08:12-06_17‬وهو الوقت ما قبل حذف المستخدم‬
‫‪.TEST‬‬
‫‪FLASHBACK DATABASE TO TIMESTAMP‬‬
‫‪TO_TIMESTAMP('17-06-08:12-55-54','DD-MM-YY:HH24-‬‬
‫;)'‪MI-SS‬‬

‫‪191‬‬
‫‪ ً-3‬نفتح قاعدة البيانات فى الوضع ‪. Resetlogs‬‬

‫;‪ALTER DATABASE OPEN RESETLOGS‬‬

‫‪SELECT USERNAME FROM DBA_USERS WHERE‬‬


‫;'‪USERNAME='TEST‬‬

‫‪ -4‬اخيرا ً لنتأكد من وجود المستخدم ‪.TEST‬‬

‫أما إذا لم نكن نعرف مثل ً وقت حذف المستخدم المستخدم ‪ TEST‬فليس‬
‫عندنا حل سواء التخمين ومن ثم فتح قاعدة البيانات فى الوضع ‪ Read Only‬والتأكد‬
‫من جدوى السترجاع وقد نلجأ لغلق قاعدة البيانات وفتحها مرة اخرى ومن ثم‬

‫إعادة ال ‪ Flashback Database‬لوقت اخر ‪ ،‬ولن نفتح قاعدة البيانات مباشرة فى‬
‫الوضع ‪ Resetlogs‬لن الخيار ‪ Restlogs‬يقوم بإعادة تهيئة ال ‪Log Sequence Number‬‬
‫ويبدأ بأخذ القيمة )‪ (001‬من جديد‪.‬‬

‫‪192‬‬

You might also like