להתחיל לעבוד עם firebird

בעקבות קריאות שלי לעבוד עם firebird (וכך שאני רוצה לראות אותו מחליף את MySQL), היו כמה אנשים שהחליטו לנסות לעבוד עם המסד נתונים, ודי לא הבינו מה קורה איתו. אני מתחיל לכתוב כמה פוסטים שהם בעצם מיני מדריכים שיעזרו לאנשים לעבוד עם מסד הנתונים, ואולי זה יקדם את השימוש בו. שימו לב שהמדריכים שלי אינם מגיעים במקום קריאה של התיעוד, אלא מספקת יותר מידע להתחיל לעבוד עם המסד נתונים עצמו.

הקדמה

חברת בורלנד שיחררה לקוד הפתוח גרסה של מסד הנתונים שלה הנקרא Interbase. הגרסה ששוחררה היתה 6.1. הגרסאות הבאות בתור, יחזרו להיות קוד סגור.

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

עד כאן לחלק ההיסטורי וההכרתי של המסד נתונים.

כיצד להתחיל לעבוד עם מסד הנתונים ?

נתחיל בכך שנתקין את השרת. כאן החל מגרסה 2, יש לנו 2 אפשרויות לבחירה:

  1. שרת קלאסי
  2. סופר שרת

השרת הקלאסי עובד בצורה המקורית שInterbase עבד (ואולי אף ממשיך לעבוד) בה. כלומר שרת אחד שפותח עוד תהליכים על כל בקשה ובקשה, ואף יודע לקבל בקשות של מערכת קבצים, בקשות רשת ועוד. הבעיה עם השרת הקלאסי המקורי היתה שאם תהליך האב היה קורס, אז היו נשארים לנו התהליכים האחרים, רק בלי תפקוד תקין (בגלל שהתהליך הראשון התנהל עם IPC מול שאר התהליכים) זה לפחות היה בגרסה 6, אינני יודע אם זה השתנה בגרסה 7 של Interbase.

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

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

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

לאחר שנריץ את firebird (שימו לב שיש הפצות לינוקס שישתמשו ב xinitd בשביל להריץ את השרת, בעוד שבהפצות אחרות יהיה daemon לכל דבר ועניין), נוכל לעבוד עם כמה מהכלים של Firebird.

הכלי הכי חשוב בעבודה עם Firebird הוא gbak. תפקיד הכלי הוא לבצע כמה דברים ממש חשובים:

  1. לגבות את מסד הנתונים שלנו
  2. לעזור לנו לשדרג מגרסה אחת לשנייה את מסד הנתונים
  3. לש/אחזר מידע ממסד או את מסד הנתונים עצמו
  4. לשנות תכונות במסד הנתונים שלנו

ל gbak יש עוד דברים שהוא יעזור לנו איתם, אבל אצור פוסט מיוחד בשביל ללמד איך לעבוד איתו.

הכלי הבא שאנחנו נרצה להכיר ולהתיידד איתו הוא isql. אם המערכת שלכם עובדת עם ODBC בלינוקס/יוניקס, בטח יש לכם עוד כלי בשם זה, שניהם יהיו ממוקמים במקומות שונים. אצלי במנדריבה isql של Firebird ממוקם ב32 ביט:

/usr/lib/firebird/bin/

ב64 ביט:

/usr/lib64/firebird/bin/

כל הפצה שומרת לעצמה את היכולת לשנות מיקומים אלו.

תפקידו של הכלי isql הוא לתת לנו גישה למסד הנתונים שברצוננו לעבוד איתו בתור cli ממש כמו הםקודה mysql של המסד נתונים, או בצורה זהה לפקודה של PosgreSQL.

להתחיל לעבוד עם isql

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

SELECT * from ViEwS;

עדיין נקבל את אותו המידע שנקבל אם נריץ את זה בשם שאנחנו יצרנו.

כאשר נריץ את הפקודה isql בצורה "ערומה", נקבל הודעה שאנחנו צריכים להתחבר או ליצור מסד נתונים.

ע"מ ליצור מסד נתונים עם הסופר שרת (איתו אני עובד בזמן כתיבת מדריך זה) נשתמש בפקודה:

SQL>CREATE DATABASE '127.0.0.1:/tmp/firebird.fdb' page_size 8192↵
CON>user 'SYSDBA' password 'masterkey'↵
CON>DEFAULT CHARACTER SET UTF8;↵

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

שימו לב שבברירת מחדל, מקובל להשתמש במשתמש SYSDBA ובסיסמה של masterkey ב Interbase ו Firebird, אבל בפועל מומלץ כמובן להחליף את זה ולא להשתמש בהגדרות ברירת מחדל.

עוד דבר שחשוב לשים לב אליו הוא הגרשיים. כל מקום בו שמתי גרשיים, הוא מקום חובה (כלומר בנתיב בו יווצר המסד נתונים, בשם משתמש ובסיסמה). במידה ולא תשימו גרשיים, תקבלו הודעות שגיאה.

לאחר היצירה נכתוב את הפקודה commit עם נקודה פסיק בשביל שכל השינויים ישמרו במסד הנתונים. שימו לב שאחרי שיצרנו את המסד נתונים, isql כבר מצביע עליו, ואין צורך להתחבר אליו.

בשביל להתחבר למסד נתונים. נשתמש בפקודה הבאה:

SQL>CONNECT 127.0.0.1:/tmp/firebird.fdb user 'SYSDBA' password 'masterkey';

ונהיה מחוברים למסד הנתונים שלנו. שימו לב שאם לא נציין את הסיסמה אז נקבל הודעת שגיאה על המשתמש שהשתמשנו בו.

לפני שנמשיך, חשוב לדעת של Firebird יש תמיכה בכמה דיאלקטים של SQL. כל דיאלקט מוסיף תמיכה בעוד דברים כדוגמת תאריך ושעה, מערכים וכו'. בד"כ נהוג לעבוד עם דיאלקט מספר 3 אשר מכיל את כל התכונות שיש ל Firebird להציע לנו.

עכשיו נריץ רגע את הפקודה

SQL>SHOW TABLES;

אנחנו נקבל כמובן הודעה שאין לנו שום טבלאות במסד הנתונים שלנו. ובכן דווקא יש ! בFirebird יש לנו טבלאות פנימיות אשר שומרות הרבה מידע ומגדירות את דרך העבודה שלנו. כל שם שמור (כלומר פנימי) או של טבלה או של שדה בFirebird יתחיל עם $RDB (שימו לב שהדולר נמצא בסוף). בשביל לראות את הטבלאות האלו, נשתמש בפקודה

SQL>SHOW SYSTEM;

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

למשל:

SQL>SELECT * FROM RDB$PAGES;

אזהרה: אל תשנו ידנית את הערכים שם ! במידה ואתם משנים, אתם יכולים לגרום למצב בו תהרסו לגמרי את מסד הנתונים שלכם אם אתם לא מבינים את משמעות השינוי שאתם עושים.

הסיבה שדיברתי על טבלאות המערכת שלנו, היא בגלל שכאשר נרצה ליצור טבלה עם אינדקס אשר מעלה את הערך בכל הכנסה של מידע (כלומר Auto Increment) אנחנו ניצור Generator או בשמו היותר RDBMS שלו Sequence (הפקודה/מונח של sequence נכנסה לגרסה 2 של Firebird, ועד אז היתה ידועה בתור Generator).

הרבה אנשים מרימים גבה כאשר מדברים על sequence בגלל שהדבר נראה להם overkill אל מול מסד נתונים כדוגמת MySQL, אבל כאשר מתחילות בעיות כאלו, מבינים כמה חשוב ערך שאנחנו יודעים שישמר בלי קשר למצב הנתונים בטבלה. שימו לב שגם PosgreSQL משתמש ב sequence בדיוק בשביל הדברים האלו.

בשביל ליצור sequence נשתמש בפקודה הבאה:

SQL>CREATE SEQUENCE first_index;

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

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

עכשיו שיצרנו sequence, נרצה ליצור טבלה שתשתמש בו:

SQL>CREATE TABLE First_Table(↵
CON>ID INTEGER PRIMARY KEY NOT NULL,↵
CON>FieldA VARCHAR(10)↵
CON>);↵

ויש לנו טבלה. איך נשתמש עכשיו ב sequence שיצרנו ? ובכן בניגוד להרבה מסדי נתונים, Firebird מבוסס אירועים ! מה הכוונה ?

אנחנו יכולים לתת הוראות למסד הנתונים מה לעשות לפני הזנת ערכים ומה לעשות אחרי הזנת נתונים (כמובן שזה עובד על עוד סוגי אירועים כמו מחיקה, עדכון וכו).

לפני שנשתמש באירועים, נאפס את ה sequence שלנו בצורה הבאה:

SQL>SET GENERATOR first_index TO 0;

ועכשיו נקשר בין האינדקס לsequence:

SQL>SET TERM !! ;↵
SQL>CREATE TRIGGER Next_Index_for_first_index FOR FIRST_TABLE↵
CON>ACTIVE BEFORE INSERT↵
CON>AS BEGIN↵
CON>IF (NEW.ID IS NULL OR NEW.ID = 0) THEN↵
CON>NEW.ID = GEN_ID(FIRST_INDEX, 1);↵
CON>END!!↵
SQL>SET TERM ; !!↵

מה שיצרנו כאן הוא טיפה מסובך, אבל אנסה להסביר אותו.

היות ובברירת מחדל נקודה פסיק מסיימת פקודה, היינו צריכים להגיד ל Firebird לשנות את זה. הסיבה היא שאם נסיים שורה בתוך ה Triggerשיצרנו, אז הפקודה תרוץ לפני הסיום, ונקבל שגיאה על כך שהשאילתא שלנו לא תקינה. לכן, אנחנו נרצה להריץ את הפקודה רק כאשר הסיום שאנחנו בחרנו יהיה (במקרה הזה 2 סימני שאלה). זו בעצם המשמעות של הפקודה SET TERM.

לאחר השימוש בפקודה, התחלנו ליצור Trigger. שימו לב ש Trigger הוא דבר מאוד גמיש וניתן לעשות איתו הרבה יותר דברים מאשר ממה שנראה בדוגמא זו. למרות שבהתחלה הוא נראה כעודף סיבוך, למעשה אנחנו יכולים בצורה זו גם להחליט מה קורה עם כל שדה אחר שמוזן לנו לפני שהוא פיזית נשמר. למשל לעשות CONCAT לכמה פרמטרים, דבר שחוסך לנו הרבה קוד בשאילתות הרגילות שלנו, ואף מקצר את פעולות ה INSERT הרגילה שנעשה. אם נגיד נרצה לשמור תיעוד של כל שינוי שהתבצע, אז ניתן להכניס את הקוד לתוך Trigger ולא בתוך התכונה שלנו, ואז בעצם גם אם יש עוד תוכנות שמתחברות למסד הנתונים, הם לא צריכות אף הן לשכפל קוד של שמירת השינויים שנעשו. וכמובן שיש עוד הרבה שימושים אחרים שניתן לעשות עם Trigger לפי הצרכים השונים של התוכנות שלנו.

אחרי CREATE TRIGGER, שמנו את השם של ה Trigger, במקרה שלנו הוא Next_Index_for_first_index, ואמרנו לו להחיל את הפעולה על הטבלה שיצרנו (First_Table).

אחר מכן אמרנו לו להפעיל את הפקודה לפני פעולת ההזנה (Insert). ניתן גם לגרום לTrigger שלנו לעבוד על עדכון ומחיקה, ואף לכתוב קוד לכל מצב בתוכו, אך כרגע אני לא אציג כיצד עושים זאת.

לאחר מכן, הגדרנו את התחלת הקוד עם AS BEGIN

הקוד שלנו עכשיו בודק האם יש ערך כלשהו לשדה ID בטבלה ברשמה הנוכחית, ורק אם אין, אנחנו נעלה את הערך ונשמור את הערך החדש ל sequence שלנו. שימו לב שה sequence בסה"כ שומר לנו את הערך האחרון שהוזן. הפרמטר השני של הפונקציה GEN_ID אומרת בכמה להעלות את הערך של הID שלנו. במקרה הזה אמרנו להעלות באחד, אבל אפשרל הבין שאפשר אפילו ליצור פעולות מתמטיות שונות בשביל לקבל ID בעל ערך אחר.

לאחר מכן, סיימנו את יצירת ה Trigger, והחזרנו למצב הקודם את סיום שורת הפקודה.

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

SQL>INSERT INTO First_Table (FieldA) VALUES ('Firebird');

ואם נעשה אח"כ פעולת SELECT פשוטה, נראה את מה שהזנו כולל ערך ל ID שלנו.

במידה ונריץ את הפקודה

SQL>SHOW TABLE First_Table;

אז נראה למה קיבלנו את הערכים כמו שרצינו:

ID                              INTEGER Not Null
FIELDA                          VARCHAR(10) Nullable
CONSTRAINT INTEG_2:
Primary key (ID)

Triggers on Table FIRST_TABLE:
NEXT_INDEX_FOR_FIRST_INDEX, Sequence: 0, Type: BEFORE INSERT, Active

עד כאן למיני מדריך שלנו לעבודה עם Firebird.

2 מחשבות על “להתחיל לעבוד עם firebird

  1. פינגבק: Flame Robin « לראות שונה

  2. פינגבק: הבלוג של ארתיום

כתיבת תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s