Firebird

Firebird (או - FirebirdSQL, בתרגום מילולי - ציפור אש), הוא מסד נתונים יחסי בקוד פתוח שיצא לראשונה ב־2002 על בסיס הקוד של תוכנת InterBase 6.0 של חברת בורלנד, שיצא לציבור באוגוסט 2000. הוא זמין למגוון מערכות הפעלה ותואם לתקן SQL92 ומימוש חלקי ל־SQL2003.
מסד הנתונים בנוי בגישה בה הוא יכול לשמש כשרת, וכן כמסד נתונים משובץ. מי שמחובר ל־Firebird תמיד ישתמש בתצורת שרת-לקוח, גם כאשר הוא משובץ, אך ההבדלים ביניהם הוא מנהל ההתקן אשר נעשה בו שימוש. אופן הפעולה של Firebird הוא תמיכה מלאה בגישת העבודה של ACID.

מסד הנתונים כולל שפה לפרוצדורות מאוחסנות ול, עם שימת דגש על ניפוי באגים. ישנן שפות תכנות רבות אשר יודעות לדבר איתו, ביניהן ניתן למצוא גם את השפות C#, C, C++, Java, Object Pascal (כדוגמת Delphi וFree Pascal), Ruby, פייתון, PHP ועוד. בנוסף ישנו חיבור לODBC.

ל־Firebird יש מספר כלי ניהול גרפיים, אשר רובם מסחריים. כלי ניהול קוד פתוח נפוץ מאוד נקרא Flamerobin.

היסטוריה

Interbase
תוכנת Interbase החלה כרעיון של ג'ים סטארקי (Jim Starkey), אשר עבד באותו הזמן בחברת דיגיטל (DEC) על מנוע SQL (שעוד לא נקראה אז בשם זה) עבור מסד נתונים רשתי עבור החברה. לג'ים צץ רעיוןלפתח מערכת שתוכל לעבוד עם מספר משתמשים בו זמנית בלי לנעול את שאר המשתמשים כאשר מישהו מושך/יוצר/מעדכן מידע (דבר שכיח במסדי נתונים טבלאיים עם יחסי שדות [Foreign keys]). הוא החל לעבוד על הרעיון עבור חברת DEC, אבל מלחמות פנימיות על הפיתוח של Rdb/VMS (אשר כיום מוכר בתור Oracle) גרמו לו לעזוב את החברה.

לאחר עזיבתו את החברה, הגיע לחברת Apollo Computers, אשר חיפשה אנשי מסדי נתונים לפתח מסד נתונים עבור גרסת ה UNIX שלה לתחנות עבודה, והסכימה לממן פיתוח. בעזרת Apollo, ג'ים פיתח את מסד הנתונים Groton Database Systems (על שם המקום בו מסד הנתונים פותח). ב-1984 החלה העבודה על מסד הנתונים, אשר ב-1986 קיבל את השם Interbase. 

אף ש־Interbase הכניס כסף לחברה, החברה התמודדה עם קשיים כספיים במכירת תוכנה, והחליטה לצאת מהשוק. החברה התחילה ב-1986 להעביר בהדרגה את מסד הנתונים שלה לחברת Ashton-Tate אשר יצרו בין היתר את מסד הנתונים dBASE. היא רכשה מספר חברות המתעסקות במסדי נתונים. לאט לאט החלה גם חברת Ashton-Tate להיכנס לבעיות, וחברת בורלנד רכשה מהם את Interbase.

Firebird
בשנת 2000 חברת בורלנד הוציאה לקוד הפתוח גרסה של מסד נתונים Interbase. הגרסה שיצאה הייתה 6.1. הגרסאות הבאות בתור, חזרו להיות קוד סגור. הסיבה ליציאת הקוד של Interbase הייתה בגלל שבורלנד רצתה חברה נפרדת עבור פיתוח מסד הנתונים, אך בגלל קשיים למצוא חברה שתסכים לתנאים הם הוציאו את Interbase בתור קוד פתוח, אבל חזרו מהר מאוד בגרסה 6.5 להחזיק בקוד ללא יציאת התיקונים חזרה.

בעקבות יציאת הקוד של Interbase יצאו כמה פרויקטים אשר המשיכו את הפיתוח של מסד הנתונים בתור קוד פתוח. הפרויקט שקיבל את תשומת לב הרבה ביותר היה פרויקט בשם Firebird. לפני מספר שנים, חלק מהפרויקטים הנוספים איחדו כוחות והקוד שלהם נכנס אף הוא ל-Firebird, מה שהוליד את גרסה 2 של מסד הנתונים עם תוספות ושינויים, כאשר הבסיס של בורלנד (כלומר הצורה שמבנה מסד הנתונים עובדה בה) נשאר זהה, ולכן גם מנוע של Interbase מסוגל לעבוד עם קובצי מסד הנתונים של Firebird עד גבול מסוים. שימו גרסה 3 תכיל שילוב קוד נוסף בפרויקט, כדוגמת תמיכה ב SMP ועוד אשר עוד לא נכנס בגרסה 2.

גישת עבודה
Firebird מכיל גישת עבודה אשר שונה מאוד ממרבית מסדי הנתונים הקיימים בקוד הפתוח כדוגמת MySQL ו־PostgreSQL, כאשר Firebird מכיל מעט מאוד תכונות יחסית, ומשאיר למשתמשים להרחיב את יכולותיו במספר דרכים.

ל-Firebird שלוש תצורות בגרסת השרת:
 תצורת שרת קלאסי, בו נוצרים מספר תהליכים, אשר מתרבים על פני כל בקשה שאותה צריך לשרת.
 תצורת סופר שרת, בו נוצר תהליכונים לכל בקשה אשר אותה צריך לשרת.
 תצורת סופר שרת קלאסי, השרת מנסה כאן לנצל את כמות המעבדים והמשאבים שעל המערכת בצורה טובה יותר על ידי חלוקה של מספר תהליכים ומספר תהליכונים.

החל מגרסה 3.0 של Firebird, יהיה שרת אחד אשר יהיה ניתן לכוון לו את התצורה בזמן ריצה, בעוד שכיום בגרסה 2.5 ניתן לקבל 3 שרתים שונים בהתאם לתצורה הרצויה.

Firebird תומך ביצירת פרוצדורות מאוחסנות, יצירת הדק (trigger), יצירת view (הגבלת צפייה בטבלאות), יצירת sequence (שמירה אטומית של אינדקס), יצירת domain (טיפוס נתונים חדש), ועבודה עם UDF. כל אלו, הם כמובן מעבר לתמיכה ביצירת טבלאות.

טבלאות פנימיות
כל מסד נתונים ב Firebird שומר את המידע והפעולות השונות על ידי שימוש בטבלאות פנימיות. חלק מטבלאות אלו משמשות לשם ניטור הפעולות השונות שנעשו במסד הנתונים, וחלקן האחר שומרות מידע על טבלאות השונות, על הדקים, פרוצדורות מאוחסנות ולמעשה כל אספקט הקיים ומגודר במסד הנתונים.

הטבלאות המשמשות לניטור מקבלות את השם המקדים של MON$ - כלומר Monitor, בעוד שהמידע על מסד הנתונים עצמו מקבל שם מקדים של RDB$.
הטבלאות הפנימיות ניתנות לצפייה כמו כל טבלה אחרת, וכן ניתן לבצע עליה פעולות כדוגמת select ואפילו insert, delete ו update.

שפת SQL
שפת ה-SQL של Firebird אינה תלויה ברישיות, כלומר אין הבדל בין אות קטנה לגדולה. חוסר התלות ברישיות קיים גם בשמות של השדות עצמם. במידה ורוצים שדה שהוא בעל תלות ברישיות, יש לשים את שם השדה עם גרש כפול (הסימן "). תחביר ה-SQL של Firebird נקרא DSQL, ומכיל את הפעולות הרגילות שיש ב־SQL. התמיכה של Firebird בפרוצדורות מאוחסנות קיבלה שפה משל עצמה בשם PSQL. שפת PSQL אינה מוגבלת אך ורק לפרוצדורות, אלא מדברת גם על כתיבת trigger במסד הנתונים. כאשר Firebird זקוק להרצת שאילתות SQL, הוא מתרגם את השפה לשפה בינארית (BLR) אשר אותה הוא מריץ בפועל, ולמעשה כך הוא גם יודע מתי יש בעיה או שגיאה עם מה שנכתב עוד לפני הרצת השאילתה עצמה.

בזכות היותו של Firebird מסד נתונים ACID מלא, כל פעולת SQL, נשמרת כטרנזקציה ויש צורך לבצע commit על מנת שהפעולות יתקבלו מעבר לחיבור הנוכחי של המשתמש. בזכות גישה זו, ניתן במידה ונעשתה טעות גם לעשות rollback עבור הטרנזקציה. במידה ולא תתבצע פעולת commit, ברגע שהחיבור יתנתק ממסד הנתונים, או חיבור אחר ינסה לצפות במידע אשר נוסף או שונה, לא יהיה זכר לפעולות שבוצעו.

כל ההגדרות, כדוגמת יצירת טבלה, יצירת פרוצדורה, הדק, view, domain וכו', נשמרות כ-DDL (ראו SQL). ל-Firebird יש תמיכה מרשימה מאוד ב-DML (ראו SQL), אשר מאפשרת לבצע מניפולציה על מידע עוד בהגדרת השדות עצמם. למשל ניתן ליצור שדה שהוא מחושב (נקרא Computed By) מנתונים אשר הוזנו כבר על ידי המשתמש. למשל במידה ונשמר שם פרטי ושם משפחה, ניתן ליצור שדה שיכיל שם מלא, על ידי שימוש בשדה שהוא Computed By. בנוסף, ניתן להגדיר ב-Firebird כי שדה מסוים יכיל ערכים מורשים בלבד, כדוגמת טווח בין 1 ל-9, או מחרוזת באורך מסוים, או אשר מכילה רק תווים מסוימים, והרשימה עוד ארוכה.
במידה ומגדירים Domain ב-Firebird, ניתן מראש גם להגדיר את מבנה המידע שרוצים, ולא חובה לשים אותו כאשר יוצרים את הטבלה או מוסיפים שדה מסוים. כל אלו הם חלק מה-DML של Firebird.

ניבים
Firebird מכיל 3 ניבים (dialect) שונים של שפת SQL, אשר כל אחת מהן מוסיפה עוד יכולות עבור השפה. הניבים נוצרו כאמצעי המרה בין גרסאות ישנות מאוד של Interbase, כאשר כיום יש להשתמש בניב מספר 3.

משמעות הניבים הם:
 ניב מס' 1
 הניב שומר את התאריכים והשעות בטיפוס מסוג DATE ומכיל טיפוס זהה בשם TIMESTAMP. 
 גרש כפול משמש לציון מחרוזות. 
 הטיפוסים NUMERIC ו DECIMAL נשמרים כ DOUBLE PRECISION ורמת הדיוק אינה יכולה לעלות מעל 9 ספרות אחרי הנקודה. 
 אין טיפוס מסוג Int64.
 ניב מס' 2 - הניב יכול להתקיים רק בלקוח המתחבר לשרת, ולא בשרת עצמו. והוא נועד לסייע בניפוי שגיאות של הניב הראשון ומסד נתונים ישן. 
 ניב מס' 3 
 הניב מאפשר לטיפוסים NUMERIC ו DECIMAL להישמר כ Int64 כאשר רמת הדיוק הנדרשת עולה על 9 ספרות אחרי הנקודה. 
 הטיפוס TIME שומר רק מידע על הזמן ללא תאריך. 
 הטיפוס DATE שומר מידע רק על התאריך ללא הזמן. 
 גרש כפול משמש לזיהוי שדות אשר צריכים להיות נבדלים ברישיות של השמות. 
 השימוש במחרוזת מתבצע על ידי גרש בודד.

אבטחה
Interbase עבר הרבה מאוד מהפכות בנושא האבטחה, ו-Firebird ממשיך לשנות גישות כיצד ניתן לנהל משתמשים וגישה למידע. Firebird ו-Interbase עובדים עם קובץ ייעודי עבור ניהול משתמשים. בגרסה 2 של Firebird הקובץ נקרא security2.fdb. מסד הנתונים מכיל משתמש ברירת מחדל בשם SYSDBA עם הסיסמה masterkey. המשתמש לרוב מקבל ייחס של משתמש על, אך ניהול הרשאות המשתמשים ממומשות בתוך מסד הנתונים הספציפי, ולא בצורה גלובלית בשרת.

Firebird מאפשר ליצור בתוך מסד נתונים קבוצות של הרשאות אשר נקראות Role, ובעצם ניתן להכיל אותן למשתמשים השונים בהתאם לצורך ולרצון, ובכך ליצור סוג של ACL (פירושה הוא Access Control List). השפה המשמשת לעבודה ותחזוקת role נקראת Data Control Language או DCL בקיצור. ניהול המשתמשים והאבטחה נעשה באמצעות כלי ייעודי בשם gsec. הכלי מאפשר ליצור משתמשים וסיסמאות עבורם.

בגרסה 2.5, נוספו טבלאות ה MON$ גם עבור ביצוע Audit Trail ו Trace אשר משמשות עבור דו"ח וניטור פעולות אשר נעשו במסד הנתונים כולל מי עשה את הפעולות.

עבודה עם UDF
Firebird תומך בגישה של UDF אשר פירושה הוא פונקציות המוגדרות על ידי המשתמש (User Defined Functions באנגלית). הגישה הזו מאפשרת לכתוב ספריות משותפות בשפה מהודרת, וניתן להשתמש בפונקציות הנכתבות בה בתוך השאילתות השונות כאילו היו חלק משפת הSQL.

יצירת UDF נעשית בצורה הבאה: 
{$IFDEF FPC}
 {$mode objfpc}
 {$packrecords c}
{$ENDIF}
library udf_library;

function get_udf_version : integer; cdecl; export;
begin
 Result := 1;
end;

exports
 get_udf_version;
end.

על מנת לטעון את הספרייה אשר נוצרה, יש להשתמש בקוד ה SQL הבא:
declare external function f_get_udf_version
returns
integer by value
entry_point 'get_udf_version' module_name 'udf_library';

בשביל להשתמש עכשיו בפונקציה, ניתן לכתוב שאילתא כזו:
select f_get_udf_version() from rdb$database

יש לזכור כי במערכות הפעלה אשר הן דמויות לינוקס או כמו יוניקס, יש להוסיף לשם הספרייה את המקדם lib לפני שם הספרייה. אין צורך להגדיר את סיומת הספרייה (כלומר so או dll).

רישיון
בורלנד הוציאה את קוד המקור תחת שני רישיונות, IPL ו־IDPL. שניהם דומים לרישיון ה־MPL של מוזילה עם שינויים מזעריים והם רישיונות copyleft חלשים.

פיתוח
מסד הנתונים נכתב במקור בשפת C וחלקו הגדול שוכתב לשפת C++ בגרסה 2.
את גרסת הפיתוח של מסד הנתונים ניתן להשיג באמצעות מערכת בקרת התצורה Subversion.

קישורים חיצוניים

 
 מסד הנתונים עוף האש, אתר הבית
 עוף האש, אתר sourceforge 
 כלי פיתוח למסד הנתונים עוף האש, אתר ibphoenix
 Flamerobin כלי ניהול קוד פתוח ל־Firebird
 Firebird Start Guide.odt - מדריך בעברית לעבודה עם FirebirdSQL בפורמט odt
 Firebird Start Guide.pdf - מדריך בעברית לעבודה עם FirebirdSQL בפורמט pdf

הערות שוליים

תוכנה חופשית
מערכות לניהול מסדי נתונים יחסיים
תוכנות שהושקו ב-2000