بعد أن طلب العيد من الأخوة مواضيع متقدمة في إدارة قواعد أوراكل وجدت أنه من الأنسب أن أقوم بإضافة موضوع جديد يختص بدروس متقدمة عن الإدارة ، و السبب أنني لم أرد أن أضم هذه الدروس إلى الدورة التي تجري حالياً لخوفي على المبتدئين في هذا المجال من إصابتهم بالإحباط نظراً لسوية هذه الدروس ، على أن يتم دمج المواضيع في منهاج متكامل نفخر به في هذا المنتدى ...
سأبدأ هذه الدروس حول مفاهيم القواعد الموزعة Distributed Database و القواعد عن بعد Remote Database و سأتطرق إلى مفهوم قواعد البيانات الغرضية في أوراكل Object Oriented Database و سأتناول مفهوم Cluster ... و غيرها ...
مقدمة :
قد يفرض عليك العمل أن تحتاج إلى أكثر من قاعدة في المؤسسة التي تعمل بها ، إما لكثرة المستخدمين بالتالي لا تستطيع القاعدة الواحدة تحمل الضغط أو لوجود تقسيمات في العمل تساعدك على ذلك .. فمثلاً : تريد للذاتية قاعدة خاصة بهم و قسم المحاسبة قاعدة أخرى بالتالي تصبح الإدارة نظرياً أسهل ...
و لكن توجد مشاكل أخرى : ماذا لو إشترك القسمان في بيانات مشتركة بين القاعدتين ؟ مثلاً ذاتية الموظفين في المؤسسة ؟؟؟؟
عندها ستضطر إلى نقل البيانات من القسم إلى الآخر .. و هذا غير معقول أليس كذلك ؟؟
إذاً نحتاج إلى آلية تمكن الموظفين في أحد هذين القسمين أن يصل القاعدة الأخرى و يقوم بجلب البيانات من جدول منها للإستفادة ..
إنتهبوا إلى ملاحظة مهمة جداً : إن جلب البيانات من القاعدة الثانية لا يتطلب أ ن يسجل الدخول إليها ... ما معنى هذا ؟ نعلم أنه في SQL PLUS نستطيع تسجيل الدخول على أي قاعدة نريدها عبر الشبكة و ذلك عبر Local Naming .. هنا الوضع مختلف : سيقوم المستخدم بتسجيل الدخول على قاعدة واحدة و سيطلب البيانات من الأخرى بدون تسجيل الدخول إليها ... هل فهم الفرق ؟؟؟؟
الحل : وصلة البيانات Database Link و Replication ( ترجمتها في القاموس هي الصدى !!!!! ) ..
من أجل تنفيذ الأمثلة في هذه الدروس سوف أعتمد على قاعدتين هما orcl و القاعدة الأخرى db2 ..
يمكن من لديه شبكة أن يقوم بتنصيب القاعدتين على جهازين مختلفين ، و من لديه جهاز واحد (مثلي ) عليه إنشاء قاعدتين على جهازه ( راجع دورة الإدارة من أجل إنشاء قواعد جديدة ) ...
و لنبدأ :
وصلة القواعد Database Link :
أكاديمياُ : هي إتصال connection يتم بين قاعدة نسميها Local Database بقاعدة أخرى Remote Database بحساب مستخدم معين و كلمة سره للإستفادة من الأغراض الموجودة داخل حساب هذا الشخص ...
عملياً :
عندما نريد أن نحضر بيانات من جدول ما في نفس القاعدة فإن التعليمة هي :
كود
select * from local_table;
أما إذا أردنا أن نحضر بيانات من جدول في قاعدة أخرى فيمكننا استعمال Database link بالشكل :
كود
select * from remotetable@remoteDatalink;
حيث أن remoteDataLink هي اسم الوصلة و الجدول RemoteTable هو في قاعدة أخرى على الشبكة .... ما رأيكم بذلك أليست رائعة ؟؟
و ليس كذلك فقط ، بل حتى يمكننا أن ننشئ مرادف synonym لذلك بحيث :
كود
create synonym remotetable for remotetable@remotedatalink;
عندها يمكنه إجراء عملية select بالشكل :
كود
select * from remotetable;
مارأيكم بذلك ؟؟؟؟
ما رأيكم بإنشاء view إعتماداً على Database link ؟؟
كود
create view myview as
select * from remotetable@remotedatalink;
select * from remotetable@remotedatalink;
و حتى يمكنك أن تقوم بعملية تعديل للبيانات الموجودة في القاعدة الأخرى :
كود
update remotetable@remotedatalink set col1=value1 ;
الآن كفانا تشويقاً و لنقوم بعملية إنشاء هذه الوصلة :
كود
create [shared] [public] database link REMOTE_CONNECT
connect to {current_user | username identified by password [authentication clause]}
using 'connect string';
connect to {current_user | username identified by password [authentication clause]}
using 'connect string';
يوجد نوعين من الوصلات : عامة public أي يمكن لجميع المستخدمين في هذه القاعدة استخدامها و خاصة private فقط للمستخدم الذي أنشأها ( يجب أن يملك هذا المستخدم صلاحية Create Database link لإنشاء الوصلة ( ..
لنشرح التعليمة :
Connect to : نحدد هنا الحساب الذي نريد الإتصال به و لدينا خيارات عدة :
Current_user : هنا سيحاول الإتصال بنفس اسم المستخدم الحالي و كلمة سره بالقاعدة الأخرى ...
Username : هنا نستطيع تحديد المستخدم الذي نريد الإتصال به و عندها يجب أن نحدد كلمة السر password لهذا الحساب ..
Connect String : هو اسم معرف الإتصال Connection Host الذي نضعه في tnsnames.ora ( راجع دورة إدارة قواعد أوراكل قسم Local Name net Configuration ) ..
ما رأيكم بأمثلة ؟؟؟
لنمنح أولاً مستخدمنا scott على القاعدة orcl صلاحية إنشاء Database Link :
كود
SQL> connect system/oracle@orcl
Connected.
SQL> grant create database link to scott;
Grant succeeded.
SQL>
Connected.
SQL> grant create database link to scott;
Grant succeeded.
SQL>
لنقوم بإنشاء وصلة بين scott على القاعدة orcl و scott على القاعدة db2 :
نلاحظ أن الحسابين متماثلين بالإسم و كلمة المرور لذلك :
كود
SQL> connect scott/tiger@orcl
Connected.
SQL> create database link db2link
2 connect to current_user
3 using 'db2';
Database link created.
Connected.
SQL> create database link db2link
2 connect to current_user
3 using 'db2';
Database link created.
لنجلب البيانات من الجدول emp :
كود
select * from emp@db2link;
ما رأيكم بإنشاء وصلة بين scott على القاعدة orcl و hr على القاعدة db2 :
كود
SQL> connect scott/tiger@orcl
Connected.
SQL> create database link db2hrlink
2 connect to hr identified by hr
3 using 'db2';
Database link created.
SQL> select * from employees@db2hrlink ;
Connected.
SQL> create database link db2hrlink
2 connect to hr identified by hr
3 using 'db2';
Database link created.
SQL> select * from employees@db2hrlink ;
ما رأيكم أن نسهل الأمور أكثر و نقوم بإنشاء synonym :
كود
SQL> create synonym employees for employees@db2hrlink;
Synonym created.
SQL> select * from employees;
Synonym created.
SQL> select * from employees;
الوصلات الديناميكية Dynamic Links : استخدام أمر Copy في SQL PLUS :
راينا في القسم السابق كيف استطعنا أن نقوم بجلب البيانات من قاعدة إلى أخرى بإستخدام الوصلات و لكن يجب أن نضع في تفكيرنا دوماً فكرة أن البيانات تبقى في القاعدة الثانية و أن هذه البيانات ليست موجودة في القاعدة الأولى ,,
قد نظطر إلى عملية نسخ البيانات من القاعدة الثانية Remot إلى الأولى local بحيث تصبح البيانات موجودة فعلاً في القاعدتين ، سأتحدث اليوم عن الأمر copy الذي نستخدمه لنسخ البيانات من قاعدة إلى قاعدة أخرى :
كود
copy from
[ remote username/ remote password@ connect string]
[to username/ password@ connect string]
{ append|create|insert|replace}
table_name
using subquery;
[ remote username/ remote password@ connect string]
[to username/ password@ connect string]
{ append|create|insert|replace}
table_name
using subquery;
حيث :
Append : يقوم بإضافة البيانات إلى الجدول و تنشئه في حالة عدم وجوده ..
Create : تنشئ جدولاً جديداً و تضع البيانات فيه
Insert : هنا تتم إضافة البيانات إلى الجدول table_name و في حال عدم وجوده فإنه يعطي خطأ ..
Replace : هنا يتم حذف الجدول table_name ثم إنشائه مرة أخرى ووضع البيانات بداخله ..
مثال :
لنقم بإنشاء جدول عند المستخدم scott في القاعدة orcl يحوي على بيانات من الجدول employees الموجود لدى hr في القاعدة db2 :
كود
SQL> connect scott/tiger@orcl
Connected.
SQL> copy from hr/hr@db2 to scott/tiger@orcl create hr_emp using select first_name , last_name from employees
Array fetch/bind size is 15. (arraysize is 15)
Will commit when done. (copycommit is 0)
Maximum long size is 80. (long is 80)
Table HR_EMP created.
107 rows selected from hr@db2.
107 rows inserted into HR_EMP.
107 rows committed into HR_EMP at scott@orcl.
SQL>
Connected.
SQL> copy from hr/hr@db2 to scott/tiger@orcl create hr_emp using select first_name , last_name from employees
Array fetch/bind size is 15. (arraysize is 15)
Will commit when done. (copycommit is 0)
Maximum long size is 80. (long is 80)
Table HR_EMP created.
107 rows selected from hr@db2.
107 rows inserted into HR_EMP.
107 rows committed into HR_EMP at scott@orcl.
SQL>
أين أصبحت البيانات ؟؟؟ أصبحت في جدول اسمه hr_emp في حساب scott في القاعدة الأولى ........
ملاحظة مهمة : إذا قام المستخدم hr في القاعدة db2 بإضافة بيانات أو حذف أو أي تعديل كان فإن هذا لن يؤدي إلى إجراء هذه التعديلات على الجدول hr_emp للمستخدم scott الموجود بالقاعدة orcl أتوماتيكياً بل يجب عليك تنفيذ أمر copy مرة أخرى :
كود
SQL> connect scott/tiger@orcl
Connected.
SQL> copy from hr/hr@db2 to scott/tiger@orcl REPLACE hr_emp using select first_name , last_name from employees
Array fetch/bind size is 15. (arraysize is 15)
Will commit when done. (copycommit is 0)
Maximum long size is 80. (long is 80)
Table HR_EMP created.
107 rows selected from hr@db2.
107 rows inserted into HR_EMP.
107 rows committed into HR_EMP at scott@orcl.
SQL>
Connected.
SQL> copy from hr/hr@db2 to scott/tiger@orcl REPLACE hr_emp using select first_name , last_name from employees
Array fetch/bind size is 15. (arraysize is 15)
Will commit when done. (copycommit is 0)
Maximum long size is 80. (long is 80)
Table HR_EMP created.
107 rows selected from hr@db2.
107 rows inserted into HR_EMP.
107 rows committed into HR_EMP at scott@orcl.
SQL>
طبعاً يوجد طريقة أتوماتيكية لفعل ذلك تدعى بــ Replication التي سأشرحها في الدرس القادم إن شاء الله ...
و الآن انتهى درسنا اليوم و أتمنى أن يكون واضحاً ... بإذن الله سوف اشرح Replication غداً إن شاء الله فأستعدوا للمعركة .....
و السلام