2. دليل تعليمي لـ Firebird
قبل الخوض في أساسيات لغة SQL، نقدم للقارئ شرحًا حول كيفية تثبيت Firebird SGBD بالإضافة إلى العميل الرسومي IB-Expert.
2.1. أين يمكن العثور على Firebird؟
الموقع الرئيسي لـ Firebird هو [http://firebird.sourceforge.net/]. توفر صفحة التنزيلات الروابط التالية (أبريل 2005):

سيتم تنزيل العناصر التالية:
ملف SGBD لنظام التشغيل Windows | |
مكتبة فئات للتطبيقات .NET تتيح الوصول إلى SGBD دون الحاجة إلى برنامج تشغيل ODBC. | |
برنامج التشغيل ODBC الخاص بـ Firebird |
قم بتثبيت هذه العناصر. يتم تثبيت SGBD في مجلد يحتوي على محتويات مشابهة لما يلي:
![]() |
توجد الملفات الثنائية في المجلد [bin]:
![]() |
يسمح بتشغيل/إيقاف SGBD | |
العميل الذي يتيح إدارة قواعد البيانات |
تجدر الإشارة إلى أن اسم مسؤول SGBD افتراضيًا هو [SYSDBA] وكلمة مروره هي [masterkey]. تم تثبيت قوائم في [Démarrer]:

يتيح الخيار [Firebird Guardian] تشغيل/إيقاف SGBD. بعد التشغيل، تظل أيقونة SGBD في شريط مهام ويندوز:
![]() |
لإنشاء قواعد بيانات Firebird واستخدامها باستخدام عميل سطر الأوامر [isql.exe]، من الضروري قراءة الوثائق المرفقة مع المنتج في المجلد [doc].
2.2. : وثائق Firebird
يمكن العثور على الوثائق الخاصة بـ Firebird ولغة SQL على موقع Firebird (يناير 2006):

تتوفر أدلة متنوعة باللغة الإنجليزية:
للبدء باستخدام FB | |
لفهم رموز الأخطاء التي ترسلها FB |
كما تتوفر أدلة تدريبية حول لغة SQL:

لمعرفة كيفية إنشاء الجداول، وأنواع البيانات التي يمكن استخدامها، ... | |
دليل مرجعي لتعلم لغة SQL باستخدام Firebird |
من الطرق السريعة للعمل مع Firebird وتعلم لغة SQL استخدام عميل رسومي. ومن أمثلة هذه العملاء برنامج IB-Expert الموصوف في الفقرة التالية.
2.3. العمل مع SGBD Firebird باستخدام IB- Expert
الموقع الرئيسي لـ IB-Expert هو [http://www.ibexpert.com/]. توفر صفحة التنزيلات الروابط التالية:

سنختار الإصدار المجاني [Personal Edition]. بمجرد تنزيله وتثبيته، سيكون لدينا مجلد مشابه لما يلي:

الملف القابل للتنفيذ هو [ibexpert.exe]. عادةً ما يتوفر اختصار في القائمة [Démarrer]:

بمجرد تشغيله، يعرض IBExpert النافذة التالية:

لنستخدم الخيار [Database/Create Database] لإنشاء قاعدة بيانات:
قد يكون [local] أو [remote]. هنا، يقع خادمنا على نفس الجهاز الذي يعمل عليه [IBExpert]. لذا نختار [local] | |
استخدم زر من النوع [dossier] في القائمة المنسدلة لتحديد ملف قاعدة البيانات. يقوم Firebird بوضع قاعدة البيانات بأكملها في ملف واحد. وهذه إحدى ميزاته. يمكن نقل قاعدة البيانات من جهاز إلى آخر بمجرد نسخ الملف. ويتم إضافة اللاحقة [.gdb] تلقائيًا. | |
SYSDBA هو المسؤول الافتراضي في الإصدارات الحالية من Firebird | |
masterkey هي كلمة مرور المسؤول SYSDBA في إصدارات Firebird الحالية | |
اللهجة SQL المطلوب استخدامها | |
إذا تم تحديد المربع، فسيعرض IBExpert رابطًا إلى قاعدة البيانات التي تم إنشاؤها بعد إنشائها |
إذا ظهرت لك الرسالة التالية عند النقر على زر الإنشاء [OK]:

فهذا يعني أنك لم تقم بتشغيل Firebird. قم بتشغيله. ستظهر نافذة جديدة:

عائلة الأحرف المطلوب استخدامها. على الرغم من أن لقطة الشاشة أعلاه لا تحتوي على أي معلومات، يُنصح باختيار عائلة الأحرف [ISO-8859-1] من القائمة المنسدلة، والتي تتيح استخدام الأحرف اللاتينية المُشَدَّدة. |
[IBExpert] قادر على إدارة مختلف إصدارات SGBD المشتقة من Interbase. اختر إصدار Firebird الذي قمت بتثبيته: |
بمجرد تأكيد هذه النافذة الجديدة بواسطة [Register]، نحصل على النتيجة التالية:

للوصول إلى قاعدة البيانات التي تم إنشاؤها، ما عليك سوى النقر مرتين على الرابط الخاص بها. عندئذٍ يعرض IBExpert شجرة تتيح الوصول إلى خصائص قاعدة البيانات:

2.4. إنشاء جدول بيانات
لنقم بإنشاء جدول. نضغط بزر الفأرة الأيمن على [Tables] (انظر النافذة أعلاه) ونختار الخيار [New Table]. تظهر لنا نافذة تعريف خصائص الجدول:
![]() |
لنبدأ بتسمية الجدول [ARTICLES] باستخدام حقل الإدخال [1]:
![]() |
لنستخدم حقل الإدخال [2] لتعريف مفتاح أساسي [ID]:
![]() |
يتم تعيين حقل كمفتاح أساسي بالنقر المزدوج على منطقة [PK] (المفتاح الأساسي) الخاصة بالحقل. لنقم بإضافة حقول باستخدام الزر الموجود أعلى [3]:

ما لم نقم بـ«تجميع» تعريفنا، لن يتم إنشاء الجدول. لنستخدم الزر [Compile] أعلاه لإنهاء تعريف الجدول. يقوم IBExpert بإعداد استعلامات SQL لإنشاء الجدول ويطلب التأكيد:

ومن المثير للاهتمام أن IBExpert يعرض الاستعلامات SQL التي نفذها. وهذا يتيح التعلم في آن واحد لكل من لغة SQL وكذلك اللهجة SQL التي قد تكون خاصة بالبرنامج. يتيح الزر [Commit] تأكيد المعاملة الجارية، بينما يتيح الزر [Rollback] إلغاءها. هنا نقبلها باستخدام [Commit]. وبمجرد القيام بذلك، يقوم IBExpert بإضافة الجدول الذي تم إنشاؤه إلى شجرة قاعدة البيانات لدينا:

بالنقر المزدوج على الجدول، يمكننا الوصول إلى خصائصه:

تتيح لنا لوحة [Constraints] إضافة قيود تكامل جديدة إلى الجدول. لنفتحها:

نجد هنا قيد المفتاح الأساسي الذي أنشأناه. يمكننا إضافة قيود أخرى:
- مفاتيح خارجية [Foreign Keys]
- قيود سلامة الحقول [Checks]
- قيود تفرد الحقول [Uniques]
نشير إلى أن:
- يجب أن تكون قيم الحقول [ID, PRIX, STOCKACTUEL, STOKMINIMUM] أكبر من 0
- يجب أن يكون الحقل [NOM] غير فارغ وفريدًا
لنفتح اللوحة [Checks] ونضغط بزر الماوس الأيمن داخل مساحة تعريف القيود الخاصة بها لإضافة قيد جديد:

لنحدد القيود المطلوبة:

يُلاحظ أعلاه أن القيد [NOM<>''] يستخدم علامتي اقتباس مفردة وليس علامتي اقتباس مزدوجة. لن نقوم بتجميع هذه القيود باستخدام الزر [Compile] أعلاه:

مرة أخرى، يُظهر IBExpert طابعًا تعليميًا من خلال الإشارة إلى الاستعلامات SQL التي نفذها. لننتقل الآن إلى اللوحة [Constraints/Uniques] للإشارة إلى أن الاسم يجب أن يكون فريدًا. وهذا يعني أنه لا يمكن وجود نفس الاسم مرتين في الجدول.

لنحدد القيد:

ثم نقوم بتجميعها. بعد ذلك، نفتح لوحة [DDL] (لغة تعريف البيانات) الخاصة بالجدول [ARTICLES]:

يقدم هذا الرمز SQL لتوليد الجدول مع جميع قيوده. يمكن حفظ هذا الرمز في برنامج نصي لإعادة تشغيله لاحقًا:
SET SQL DIALECT 3;
SET NAMES NONE;
CREATE TABLE ARTICLES (
ID INTEGER NOT NULL,
NOM VARCHAR(20) NOT NULL,
PRIX DOUBLE PRECISION NOT NULL,
STOCKACTUEL INTEGER NOT NULL,
STOCKMINIMUM INTEGER NOT NULL
);
ALTER TABLE ARTICLES ADD CONSTRAINT CHK_ID check (ID>0);
ALTER TABLE ARTICLES ADD CONSTRAINT CHK_PRIX check (PRIX>0);
ALTER TABLE ARTICLES ADD CONSTRAINT CHK_STOCKACTUEL check (STOCKACTUEL>0);
ALTER TABLE ARTICLES ADD CONSTRAINT CHK_STOCKMINIMUM check (STOCKMINIMUM>0);
ALTER TABLE ARTICLES ADD CONSTRAINT CHK_NOM check (NOM<>'');
ALTER TABLE ARTICLES ADD CONSTRAINT UNQ_NOM UNIQUE (NOM);
ALTER TABLE ARTICLES ADD CONSTRAINT PK_ARTICLES PRIMARY KEY (ID);
2.5. إدخال البيانات في الجدول
حان الوقت الآن لإدخال البيانات في الجدول [ARTICLES]. وللقيام بذلك، سنستخدم لوحة التحكم الخاصة به [Data]:

يتم إدخال البيانات بالنقر المزدوج على حقول الإدخال في كل سطر من الجدول. يتم إضافة صف جديد باستخدام الزر [+]، وحذف صف باستخدام الزر [-]. تتم هذه العمليات ضمن معاملة يتم تأكيدها بواسطة الزر [Commit Transaction] (انظر أعلاه). وبدون هذا التأكيد، ستُفقد البيانات.
2.6. المحرر SQL الخاص بـ [IB-Expert]
تتيح لغة SQL (لغة الاستعلام الهيكلية) للمستخدم ما يلي:
- إنشاء جداول مع تحديد نوع البيانات التي ستخزنها، والقيود التي يجب أن تستوفيها هذه البيانات
- إدراج البيانات فيها
- تعديل بعضها
- حذف بيانات أخرى
- استخراج المحتوى منها للحصول على معلومات
- ...
يتيح IBExpert للمستخدم إجراء العمليات من 1 إلى 4 بطريقة رسومية. وقد رأينا ذلك للتو. عندما تحتوي قاعدة البيانات على العديد من الجداول التي تحتوي كل منها على مئات الأسطر، نحتاج إلى معلومات يصعب الحصول عليها بصريًا. لنفترض على سبيل المثال أن متجرًا إلكترونيًا على الويب يستقبل آلاف المشترين شهريًا. يتم تسجيل جميع عمليات الشراء في قاعدة بيانات. بعد ستة أشهر، نكتشف أن المنتج «X» معيب. نرغب في الاتصال بجميع الأشخاص الذين اشتروه حتى يعيدوا المنتج لاستبداله مجانًا. كيف يمكن العثور على عناوين هؤلاء المشترين؟
- يمكننا الاطلاع بصريًّا على جميع الجداول والبحث عن هؤلاء المشترين. سيستغرق ذلك بضع ساعات.
- يمكن إصدار أمر SQL الذي سيعطي قائمة بهؤلاء الأشخاص في غضون ثوانٍ معدودة
تكون لغة SQL مفيدة
- عندما تكون كمية البيانات في الجداول كبيرة
- عندما يكون هناك العديد من الجداول المرتبطة ببعضها البعض
- عندما تكون المعلومات المطلوبة موزعة على عدة جداول
- ...
نقدم الآن محرر SQL الخاص بـ IBExpert. يمكن الوصول إليه عبر الخيار [Tools/SQL Editor] أو [F12]:

وبذلك يمكننا الوصول إلى محرر استعلامات متطور SQL يمكننا من خلاله تجربة الاستعلامات. لنكتب استعلامًا:

نقوم بتنفيذ الاستعلام SQL باستخدام الزر [Execute] الموجود أعلاه. ونحصل على النتيجة التالية:

في الأعلى، تعرض علامة التبويب [Results] جدول نتائج الأمر SQL [Select]. لإصدار أمر جديد SQL، يكفي العودة إلى علامة التبويب [Edit]. عندها نجد الأمر SQL الذي تم تنفيذه.
![]()
توجد عدة أزرار مفيدة في شريط الأدوات:
- يتيح الزر [New Query] الانتقال إلى استعلام جديد SQL:

وعندها تظهر صفحة تحرير فارغة:

يمكننا بعد ذلك كتابة أمر جديد SQL:

وتنفيذه:

لنعد إلى علامة التبويب [Edit]. يتم حفظ الأوامر المختلفة SQL التي تم إصدارها بواسطة [IB-xpert]. يتيح الزر [Previous Query] العودة إلى أمر SQL تم إصداره سابقًا:

وبذلك نعود إلى الطلب السابق:

أما الزر [Next Query] فيتيح الانتقال إلى الأمر التالي SQL:

ثم نجد الأمر SQL الذي يلي الأمر SQL في قائمة الأوامر المخزنة:

يتيح الزر [Delete Query] حذف أمر SQL من قائمة الأوامر المخزنة:

يتيح الزر [Clear Current Query] مسح محتوى المحرر الخاص بالأمر SQL المعروض:

يتيح الزر [Commit] تأكيد التعديلات التي تم إجراؤها على قاعدة البيانات بشكل نهائي:

يتيح الزر [RollBack] إلغاء التعديلات التي تم إجراؤها على قاعدة البيانات منذ آخر عملية [Commit]. إذا لم يتم إجراء أي عملية [Commit] منذ الاتصال بقاعدة البيانات، فسيتم إلغاء التعديلات التي تم إجراؤها منذ هذا الاتصال.

لنأخذ مثالاً. لنقم بإدراج سطر جديد في الجدول:
![]()
يتم تنفيذ الأمر SQL ولكن لا يظهر أي عرض. لا يمكننا معرفة ما إذا كان الإدراج قد تم أم لا. لمعرفة ذلك، لنقم بتنفيذ الأمر SQL الذي يلي الأمر [New Query]:

ونحصل على النتيجة التالية لـ [Execute]:

وبالتالي، فقد تم إدراج السطر بالفعل. دعونا الآن نفحص محتوى الجدول بطريقة أخرى. انقر نقرًا مزدوجًا على الجدول [ARTICLES] في مستكشف قواعد البيانات:

ونحصل على الجدول التالي:

يتيح الزر الذي يحمل رمز السهم أعلاه تحديث الجدول. بعد التحديث، لا يتغير الجدول أعلاه. يبدو أن السطر الجديد لم يتم إدراجه. لنعد إلى المحرر SQL (F12) ثم نقوم بتأكيد الأمر SQL الذي تم إصداره باستخدام الزر [Commit]:

بعد ذلك، لنعد إلى الجدول [ARTICLES]. يمكننا ملاحظة أنه لم يتغير شيء حتى عند استخدام الزر [Refresh]:

أعلاه، لنفتح علامة التبويب [Fields] ثم نعود إلى علامة التبويب [Data]. هذه المرة، يظهر السطر الذي تم إدراجه بشكل صحيح:

عندما يبدأ إصدار الأوامر المختلفة SQL، يفتح المحرر ما يُسمى «معاملة» في قاعدة البيانات. لن تكون التعديلات التي أجراها محرر SQL عبر أوامر SQL مرئية إلا طالما بقينا في نفس المحرر SQL (يمكن فتح عدة محررات). يبدو الأمر كما لو أن المحرر SQL لا يعمل على قاعدة البيانات الفعلية بل على نسخة خاصة به. في الواقع، لا تسير الأمور بهذه الطريقة بالضبط، لكن هذه الصورة يمكن أن تساعدنا في فهم مفهوم المعاملة. لن تظهر جميع التعديلات التي أُجريت على النسخة خلال المعاملة في قاعدة البيانات الفعلية إلا بعد المصادقة عليها بواسطة [Commit Transaction]. عندئذٍ تنتهي المعاملة الحالية وتبدأ معاملة جديدة.
يمكن إلغاء التعديلات التي تم إجراؤها خلال المعاملة من خلال عملية تُسمى [Rollback]. لنقم بالتجربة التالية. لنبدأ معاملة جديدة (يكفي تنفيذ الأمر [Commit] على المعاملة الحالية) باستخدام الأمر SQL التالي:

لننفذ هذا الأمر الذي يحذف جميع السطور من الجدول [ARTICLES]، ثم ننفذ الأمر الجديد SQL التالي:

ونحصل على النتيجة التالية:

تم حذف جميع الصفوف. لنتذكر أن هذه العملية تمت على نسخة من الجدول [ARTICLES]. للتحقق من ذلك، لنضغط مرتين على الجدول [ARTICLES] أدناه:

ونعرض علامة التبويب [Data]:

حتى عند استخدام الزر [Refresh] أو الانتقال إلى علامة التبويب [Fields] ثم العودة بعد ذلك إلى علامة التبويب [Data]، لا يتغير المحتوى أعلاه. وقد تم شرح ذلك. نحن الآن في معاملة أخرى تعمل على نسختها الخاصة. لنعد الآن إلى المحرر SQL (F12) ونستخدم الزر [RollBack] لإلغاء عمليات حذف الأسطر التي تمت:

يُطلب منا التأكيد:

لنؤكد ذلك. يؤكد المحرر SQL أن التعديلات قد تم التراجع عنها:

لنُعيد تشغيل الطلب SQL أعلاه للتحقق. نجد الأسطر التي تم حذفها:

أعادت العملية [Rollback] النسخة التي يعمل عليها المحرر SQL إلى الحالة التي كانت عليها في بداية المعاملة.





