טיפ שני ב Firebird

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

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

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

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

אז לשם שינוי השם, אנחנו נשתמש ב 2 השאילתות הבאות:

UPDATE RDB$RELATIONS
SET RDB$RELATION_NAME='NEWNAME'
WHERE RDB$RELATION_NAME='OLDNAME';
COMMIT;

UPDATE RDB$RELATION_FIELDS
SET RDB$RELATION_NAME='NEWNAME'
WHERE RDB$RELATION_NAME='OLDNAME' and RDB$SYSTEM_FLAG=0;
COMMIT;

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

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

חשוב לדעת שאם השתמשנו בשאילתאות, stored procedure, triggers, view וכו' עם הטבלה הישנה, צריך לשנות גם שם את השם לטבלה החדשה, וזה כבר יכול להשתנות ידנית, ממש כמו בשאר מסדי הנתונים שאני מכיר לפחות.

5 מחשבות על “טיפ שני ב Firebird

  1. Shai

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

  2. ik_5 מאת

    1. ניסיון כואב שלא תמיד ה טרזאקציה פורשה נכון ללא בלוק של transaction.
    כלומר שזה הצליח לעבוד רק על השאילתא השנייה שנכתבה לפני ביצוע הcommit.
    כלומר השאילתא הראשונה לא נכנסה לאותה טרזאקציה ולך תחפש למה. ולכן צריך ליצור בלוק שמתחיל על transaction והחוקים שלו לפני בשביל להיות בטוחים לגמרי ב100 אחוז שזה תופס את כולם בטרזאקציה אחת. זה היה קורה לי ב1.0 ואף פעם לא בגרסאות חדשות יותר, אבל מי שכנווה ברוטחין, נזהר בצוננים.

    2. הרגל. אני מעדיף לדעת מהר מאוד שמשהו לא הצליח ואם כן למה.

    3. אנשים שמגיעים מ MySQL שוכחים שכאן בלי commit הפעולה לא באמת התבצעה ואנחנו רואים אח"כ הרבה בעיות עם זה

    פרט לזה אין סיבה אמיתית למה לעשות commit לפני השאילתא האחרונה.

  3. Shai

    1. שאלת לא-כל-כך תם: זה יותר מסובך מהפקודה begin transaction לפני ה-update הראשון?

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

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

  4. ik_5 מאת

    ביצעתי בקשה רשמית ב Firebird להוסיף תחביר לשנות את שם הטבלה, מעניין מה יצא מזה.
    http://tracker.firebirdsql.org/browse/CORE-2486

    כמו כן, בעקבות פרסום הפוסט (ועל זה שדיברתי עליו ב twitter), הוסיפי לרשימת ה"לעשות" של Flamerobin אפשרות לשנות את השם דרך הממשק.

    ואנשים לא מבינים את החשיבות של טוויטר ורשתות חברתיות לפעמים🙂

כתיבת תגובה

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

הלוגו של WordPress.com

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

תמונת Twitter

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

תמונת Facebook

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

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

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

מתחבר ל-%s