2. آموزش فایربرد
پیش از پرداختن به مبانی زبان SQL، به خواننده نشان خواهیم داد که چگونه Firebird SGBD و کلاینت گرافیکی IB-Expert را نصب کند.
2.1. کجا میتوانم Firebird را پیدا کنم؟
وبسایت اصلی Firebird به آدرس [http://firebird.sourceforge.net/] است. صفحه دانلود پیوندهای زیر را ارائه میدهد (آوریل ۲۰۰۵):

شما باید فایلهای زیر را دانلود کنید:
SGBD برای ویندوز | |
یک کتابخانه کلاسی برای برنامههای NET، که امکان دسترسی به SGBD را بدون استفاده از درایور ODBC فراهم میکند. | |
راننده Firebird ODBC |
این کامپوننتها را نصب کنید. SGBD در پوشهای با محتویات مشابه موارد زیر نصب میشود:
![]() |
فایلهای باینری در پوشه [bin] قرار دارند:
![]() |
به شما امکان میدهد SGBD را راهاندازی/متوقف کنید | |
یک کلاینت خط فرمان برای مدیریت پایگاههای داده |
توجه داشته باشید که بهطور پیشفرض، مدیر برای SGBD با نام [SYSDBA] و رمز عبور [masterkey] است. منوها در [Démarrer] نصب شدهاند:

گزینه [Firebird Guardian] به شما امکان میدهد SGBD را راهاندازی/متوقف کنید. پس از راهاندازی، آیکون SGBD در نوار وظیفه ویندوز باقی میماند:
![]() |
برای ایجاد و مدیریت پایگاههای داده Firebird با استفاده از کلاینت خط فرمان [isql.exe]، باید مستندات ارائهشده همراه محصول را در پوشه [doc] مطالعه کنید.
2.2. : مستندات Firebird
مستندات مربوط به Firebird و زبان SQL را میتوان در وبسایت Firebird (ژانویه ۲۰۰۶) یافت:

دستورالعملهای مختلفی به زبان انگلیسی موجود است:
شروع کار با FB | |
برای درک کدهای خطایی که توسط FB بازگردانده میشوند |
دفترچههای آموزشی زبان SQL نیز در دسترس هستند:

برای اطلاع از نحوه ایجاد جدولها، انواع دادههای قابل استفاده و غیره. | |
راهنمای مرجع برای یادگیری زبان SQL با فایربرد |
یک روش سریع برای کار با 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] to یک پایگاه داده ایجاد کنیم:
میتواند [local] یا [remote] باشد. در اینجا، سرور ما روی همان دستگاهی است که [IBExpert] روی آن قرار دارد. بنابراین [local] را انتخاب میکنیم | |
برای انتخاب فایل پایگاه داده، از دکمه نوع [dossier] در منوی کشویی استفاده کنید. فایربرد کل پایگاه داده را در یک فایل واحد ذخیره میکند. این یکی از نقاط قوت آن است. شما میتوانید پایگاه داده را به سادگی با کپی کردن فایل از یک کامپیوتر به کامپیوتر دیگر منتقل کنید. پسوند [.gdb] به طور خودکار اضافه میشود. | |
SYSDBA مدیر پیشفرض توزیعهای فعلی Firebird است. | |
masterkey رمز عبور مدیر SYSDBA در توزیعهای فعلی Firebird است. | |
گویش SQL برای استفاده | |
اگر این کادر تیک خورده باشد، IBExpert پس از ایجاد، پیوندی به پایگاه داده ایجاد شده نمایش خواهد داد |
اگر هنگام کلیک روی دکمه ایجاد [OK]، هشدار زیر را دریافت کردید:

این بدان معناست که شما Firebird را راهاندازی نکردهاید. آن را راهاندازی کنید. یک پنجره جدید ظاهر خواهد شد:

مجموعه کاراکتر برای استفاده. اگرچه اسکرینشات بالا هیچ اطلاعاتی را نشان نمیدهد، توصیه میشود مجموعه کاراکتر [ISO-8859-1] را از لیست کشویی انتخاب کنید، زیرا این امکان استفاده از کاراکترهای لاتین دارای علامت نگارشی را فراهم میکند. |
[IBExpert] قادر به پشتیبانی از انواع مختلف SGBD مشتقشده از Interbase است. نسخهای از Firebird را که نصب کردهاید انتخاب کنید: |
پس از تأیید این پنجره جدید توسط [Register]، نتیجه به شرح زیر است:

برای دسترسی به پایگاه دادهٔ ایجادشده، کافی است روی پیوند آن دوبار کلیک کنید. سپس IBExpert ساختار درختیای را نمایش میدهد که دسترسی به ویژگیهای پایگاه داده را فراهم میکند:

2.4. ایجاد یک جدول داده
بیایید یک جدول ایجاد کنیم. روی [Tables] (پنجره بالا را ببینید) کلیک راست کرده و گزینه [New Table] را انتخاب کنید. این کار پنجره تعریف ویژگیهای جدول را باز میکند:
![]() |
بیایید با استفاده از فیلد ورودی [1]، جدول را [ARTICLES] نامگذاری کنیم:
![]() |
بیایید از فیلد ورودی [2] برای تعریف یک کلید اصلی [ID] استفاده کنیم:
![]() |
با دوبار کلیک روی فیلد «Primary Key» برای [PK]، یک فیلد به کلید اصلی تبدیل میشود. بیایید با استفاده از دکمه بالای [3] فیلدها را اضافه کنیم:

تا زمانی که تعریف خود را «کامپایل» نکرده باشیم، جدول ایجاد نخواهد شد. بیایید با استفاده از دکمه [Compile] در بالا، تعریف جدول را نهایی کنیم. IBExpert پرسوجوهای SQL را برای ایجاد جدول آماده میکند و درخواست تأیید میکند:

جالب اینجاست که IBExpert پرسوجوهایی را که اجرا کرده است، نمایش میدهد. این امکان را به شما میدهد تا هم زبان 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] (به بالا مراجعه کنید) نهایی میشود. بدون این commit، دادهها از دست خواهند رفت.
2.6. ویرایشگر SQL برای [IB-Expert]
زبان SQL (زبان پرسوجوی ساختیافته) به کاربر اجازه میدهد تا:
- ایجاد جدولها با مشخص کردن نوع دادههایی که ذخیره خواهند کرد و محدودیتهایی که این دادهها باید برآورده کنند
- وارد کردن دادهها به درون آنها
- تغییر برخی دادهها
- حذف سایر دادهها
- استخراج اطلاعات از دادهها
- ...
IBExpert به کاربر امکان میدهد عملیات ۱ تا ۴ را بهصورت گرافیکی انجام دهد. ما همین حالا این را دیدیم. وقتی پایگاه داده شامل جداول متعددی باشد که هر کدام صدها سطر داشته باشند، به اطلاعاتی نیاز داریم که بهدستآوردن آنها بهصورت بصری دشوار است. فرض کنید، برای مثال، یک فروشگاه آنلاین در ماه هزاران مشتری دارد. تمام خریدها در یک پایگاه داده ثبت میشوند. پس از شش ماه، مشخص میشود که محصول «X» معیوب است. هدف این است که با همه کسانی که آن را خریدهاند تماس گرفته شود تا بتوانند محصول را برای تعویض رایگان بازگردانند. چگونه میتوان آدرس این مشتریان را پیدا کرد؟
- میتوان به صورت دستی همه جدولها را بررسی کرد و این مشتریان را جستجو کرد. این کار چند ساعت طول خواهد کشید.
- ما میتوانیم یک پرسوجوی SQL صادر کنیم که در عرض چند ثانیه فهرستی از این افراد را بازمیگرداند
زبان SQL هرگاه مفید است
- حجم دادهها در جداول زیاد است
- جدولهای زیادی به یکدیگر مرتبط هستند
- اطلاعات مورد نیاز در چندین جدول پراکنده است
- ...
اکنون ویرایشگر SQL از IBExpert را ارائه میدهیم. این ویرایشگر از طریق گزینههای [Tools/SQL Editor] یا [F12] قابل دسترسی است:

این به ما دسترسی به یک ویرایشگر پرسوجوی پیشرفته 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) بازگردیم و سپس با استفاده از دکمه [Commit]، سفارش SQL صادر شده را تأیید کنیم:

پس از انجام این کار، بیایید به جدول [ARTICLES] بازگردیم. میبینیم که حتی با استفاده از دکمه [Refresh] نیز هیچ تغییری ایجاد نشده است:

در بالا، زبانه [Fields] را باز کرده و سپس به زبانه [Data] بازگردیم. این بار، سطر درجشده به درستی نمایش داده میشود:

هنگامی که دستورات مختلف SQL صادر میشوند، ویرایشگر چیزی را که به آن تراکنش روی پایگاه داده گفته میشود، باز میکند. تغییراتی که توسط این دستورات SQL از ویرایشگر SQL ایجاد میشوند، تنها زمانی قابل مشاهده خواهند بود که در همان ویرایشگر SQL باقی بمانید (میتوانید چندین ویرایشگر را باز کنید). گویی ویرایشگر SQL نه روی پایگاهدادهٔ واقعی، بلکه روی یک نسخهٔ کپی از آن کار میکند. در واقع، این دقیقاً نحوهٔ کار آن نیست، اما این تشبیه میتواند به ما در درک مفهوم تراکنش کمک کند. هر تغییری که در طول یک تراکنش روی نسخهٔ کپی ایجاد شود، تنها پس از اینکه با استفاده از [Commit Transaction] تثبیت (commit) شود، در پایگاه دادهٔ اصلی قابل مشاهده خواهد بود. سپس تراکنش جاری تکمیل شده و یک تراکنش جدید آغاز میشود.
تغییراتی که در طول یک تراکنش ایجاد میشوند را میتوان با دستوری به نام [Rollback] برگشت داد. بیایید آزمایش زیر را امتحان کنیم. بیایید یک تراکنش جدید را با دستور زیر شروع کنیم (به سادگی [Commit] را روی تراکنش فعلی اجرا کنید): SQL:

بیایید این دستور را اجرا کنیم که تمام سطرها را از جدول [ARTICLES] حذف میکند، سپس [New Query] را اجرا کنیم، و در ادامه دستور جدید SQL را به شرح زیر اجرا کنیم:

نتیجه زیر را به دست میآوریم:

تمام سطرها حذف شدهاند. به یاد داشته باشید که این کار بر روی یک کپی از جدول [ARTICLES] انجام شد. برای بررسی این موضوع، روی جدول [ARTICLES] در زیر دوبار کلیک کنید:

و زبانه [Data] را مشاهده کنیم:

حتی اگر از دکمه [Refresh] استفاده کنید یا به برگه [Fields] بروید و سپس به برگه [Data] بازگردید، محتوای بالا بدون تغییر باقی میماند. این موضوع قبلاً توضیح داده شده است. ما در یک تراکنش متفاوت هستیم که روی نسخهٔ اختصاصی خود کار میکند. اکنون بیایید به ویرایشگر SQL (F12) بازگردیم و از دکمهٔ [RollBack] برای لغو حذف خطوط انجامشده استفاده کنیم:

از ما خواسته میشود تأیید کنیم:

بیایید تأیید کنیم. ویرایشگر SQL تأیید میکند که تغییرات لغو شدهاند:

بیایید پرسوجوی SQL بالا را دوباره اجرا کنیم تا بررسی کنیم. میتوانیم ردیفهایی را که حذف شده بودند ببینیم:

عملیات [Rollback] نسخه کپیای را که ویرایشگر SQL روی آن کار میکند، به حالتی که در ابتدای تراکنش بود بازگردانده است.





