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

‫الجزء الول‬

Obay Salah Mirgani (Oracle 10g DBA OCP)
obaysalah@hotmail.com

1

‫الفهرس‬

‫الصفحة‬

‫الموضوع‬

‫المسلسل‬

3

‫الهداء‬

1

4

‫المقدمة‬

2

6

‫مكونات قاعدة البيانات أوركل‬
Oracle Architectural Components

3

27

‫إنشاء قاعدة البيانات أوركل‬
Creating an Oracle Database

4

47

‫التحكم فى قاعدة البيانات‬
Controlling the Database

5

63

Managing Tablespaces and Data files

6

79

Control File & Redo Log Files

7

100

‫إدارة المستخدمين‬
Administering Usersِ

8

126

‫تأمين ومراقبة قاعدة البيانات‬
Oracle Database Security & Monitoringِ

9

160

Oracle Net Services & Database Link & metrlized View

10

189

Undo Management & Flashback Technology

11

2

‫الهداء‬

‫لهبا‬

‫جنا رسائلنا‬
‫دب ً‬
‫إلى ِرحـــابك ً‬

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

‫‪3‬‬

‫تكاد ُتحــرق من اشواقنا‬
‫وقبلها قد بعثنا الدمــع‬
‫مهرا ً وإل قد بعثنا القلب‬
‫ومن دمانا كتبنا الشعر‬

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

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

‫‪4‬‬

5

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

‫‪6‬‬

‫‪Oracle Database‬‬

‫‪Oracle Instance‬‬

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

‫‪7‬‬

:Oracle Instance 1.1
8

‫وهى تتكون من جزئين رئيسيين كما فى الشكل اعله ‪-:‬‬

‫•‬

‫‪Structure‬‬

‫•‬

‫‪Memory‬‬
‫‪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

Oracle 6 thru 10g

Library cache
Shared SQL Areas*
Private SQL Areas*
PL/SQL Procedures*
and Packages
Various Control*
Structure

Dictionary Cache
Row Cache *
LOG_BUFFER

Redo entries *

Write List *
LRU List *

Large Pool

DB_2K_CACHE_SIZE
DB_4K_CACHE_SIZE
DB_8K_CACHE_SIZE
DB_16K_CACHE_SIZE
DB_32K_CACHE_SIZE
DB_KEEP_CACHE_SIZ
E
DB_RECYCLE_CACHE
_SIZE
LARGE_POOL_SIZE

Form Oracle 8i
Java Pool

JAVA_POOL_SIZE

Redo Log Buffer
Oracle 6 thru 10g
Database Buffer
Cache
Oracle 6 thru 10g

From Oracle 8i
Streams Pool
From Oracle 10g

STREAMS_POOL_SIZE

Shared server *
Oracle XA *
I/O Server Processes
Backup & Restore
Run stats*
Methods*
Classes*
Session code*
Data in JVM
Stream activity*

Oracle need to allocate
& deallocate memory
as SQL or Procedural
Code is executed based
on the individual needs
of users sessions and in
accordance to the LRU
algorithm

Highly accessed
memory structure that
provide information on
object structure to
SQL statements being
parsed
Holds changes made to
data and allows for
reconstruction of data
in the case of failure
Holds copies of data
requested by SQL and
reduces requests to disk
by having data in
memory
You may have many
different buffer caches
that help segregate on
usage patterns
For large memory
allocations
Memory available for
the java memory
manager to use for all
things Java
New to Oracle 10g
Memory available for
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‬‬

‫‪-3‬‬
‫‪-4‬‬
‫‪-5‬‬
‫‪-6‬‬
‫‪-7‬‬

‫لحظة حدوث ال ‪ Log Switch‬وسنتحدث عنه لحقا ً ‪.‬‬
‫لحظة إغلق قاعدة البيانات ‪.‬‬
‫لحظة وصول ال ‪ Block‬للقيمة المحددة ‪.‬‬
‫لحظة إمتلء ال ‪. Buffer‬‬
‫عند عمل التى ‪-:‬‬

‫* ‪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‬‬
‫‪-4‬‬

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

‫نتابع خطوات إنشاء قاعدة بيانات اوركل عن طريق الداة‬
‫‪(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‬‬

‫‪-1‬‬
‫‪-2‬‬
‫‪-3‬‬
‫‪-4‬‬

‫‪.NORMAL‬‬
‫‪.TRANSACTIONAL‬‬
‫‪.IMMEDIATE‬‬
‫‪.ABORT‬‬

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

‫‪50‬‬

‫‪: TRANSACTIONAL -2‬‬

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

‫‪-3‬‬

‫‪:IMMEDIATE‬‬
‫فى هذا الوضع من الغلق تحدث الخطوات التالية ‪-:‬‬
‫• العمليات الحالية فى قاعدة البيانات يتم قطعها مباشرةً‬
‫‪.‬‬
‫• ‪ 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‬‬

‫‪-1‬‬

‫التى ‪:‬‬

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

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

‫‪-2‬‬

‫‪54‬‬

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

55

‫تحدثنا سابقا ً ان التخزين فى قاعدة البيانات يكون على حالتين الول‬
‫التخزين المنطقى ‪ Logical‬فى ال ‪ Tablespaces‬والثانى ‪ Physical‬فى ال ‪Data‬‬
‫‪. Files‬‬
‫وذكرنا كذلك أن اى ‪ Data Files‬يكون فى قاعدة البيانات هو فى الحقيقة‬
‫ينتمى ل ‪ Tablespace‬واحد ‪.‬‬
‫بمعنى اخر أنه ل يوجد ‪ Data Files‬فى قاعدة البيانات ل ينتمى ل‬
‫‪. Tablespace‬‬

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

‫‪56‬‬

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

57

‫‪-1‬‬

‫‪58‬‬

‫مفاهيم عامة عن ال ‪:Tablespaces‬‬

‫الشكل اعله يوضح الخيارات المتاحة لل ‪ 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‬‬
‫‪-2‬‬

‫‪:Logging‬‬
‫‪ :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‬‬

‫‪-7‬‬

‫‪:SQL‬‬
‫‪ :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 ‫ لعادة تسمية ال‬8ALTER 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‬وهى ‪:‬‬

‫‪AUDITING‬‬
‫‪AUDITING‬‬
‫‪AUDITING‬‬
‫‪AUDITING‬‬

‫‪124‬‬

‫‪.SESSION‬‬
‫‪SQL STATEMENT‬‬
‫‪SYSTEM PRIVILEGE‬‬
‫‪OBJECT PRIVILEGE‬‬

‫‪: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‬قيمة الحقل قبل التعدل وبعد التعديل ‪.‬‬
‫ثانيًا‪ :‬يلزم مدير قاعدة البيانات إنشاء الجدول لتخزين المعلومات عن عمليات‬
‫التعديل ‪,‬‬

‫‪125‬‬

‫(‪CREATE TABLE BOOK_AUDIT‬‬
‫‪OS_USER VARCHAR2(70),‬‬
‫‪UPDATE_DATE DATE,‬‬
‫‪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-MMYY: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-MMYYYY: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‬‬

‫‪186‬‬

‫‪ALTER SYSTEM SET‬‬
‫’\‪LOG_ARCHIVE_DEST_1='LOCATION=D:\ARCHIVE‬‬
‫;‪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‬‬

Sign up to vote on this title
UsefulNot useful