מאפיינים מתקדמים של Constraints - ilDBA Portal

מאפיינים מתקדמים של Constraints

01/01/2011 | פורסם על ידי

מאפיינים מתקדמים של constraint-ים

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

  1. מאפשרים לנו לשמור על data integrity ברמת הטבלה, לדוגמא על ידי שימוש ב- not null, unique או check.
  2. מאפשרים לנו לשמור על data integrity בין טבלאות על ידי שימוש ב- foreign key.
  3. נותנים מידע ל- optimizer  ומאפשרים לו לבצע שאילתות בצורה אופטימלית.

אבל בנוסף למאפיינים המוכרים של כל constraint, ישנם מספר מאפיינים נוספים שאפשר להגדיר ויכולים לעזור לנו מאד במקרים מסויימים. בואו נסקור את המאפיינים האלה:

Deferraraints

כאשר יש constraint על שדה, ומכניסים לטבלה רשומה שמפירה אותו, ההכנסה עצמה נכשלת מיד עם הודעת שגיאה. זאת ההתנהגות הרגילה ובדרך כלל נרצה שככה בסיס הנתונים יתנהג. לדוגמא, אם נכניס רשומה עם ערך כפול לעמודה שיש עליה unique constraint, ההכנסה עצמה תכשל מיד.

קיימים, עם זאת, מקרים שבהם אנחנו חייבים להפר את ה- constraint תוך כדי עבודה בידיעה שנתקן את המידע מיד לאחר מכן. דוגמא כזאת יכולה להיות טבלה עם foreign key שאנחנו (משום מה) חייבים למחוק את רשומת האב לפני רשומת הבן, דבר שאינו חוקי מבחינת ה- constraint. כמובן שאחרי זה אנחנו חייבים למחוק גם את רשומת הבן. כפי שראינו, אין אפשרות למחוק את רשומת האב קודם, כי המחיקה תיכשל מיד.

כדי לאפשר זאת, אנחנו יכולים להגדיר את ה- constraint כ- deferred. כעת נוכל להפר את ה- constraint בתוך טרנזקציה בודדה ואורקל יבדוק ויאכוף את ה- constraint רק בזמן ה- commit.

כדי להגדיר deferred constraint הוא קודם כל צריך להיווצר עם המאפיין deferrable. את המאפיין הזה אי אפשר לשנות על constraint קיים, אלא רק להגדיר אותו בעת יצירת constraint חדש.

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

חשוב לציין שישנן כמה סיבות שבגללן לא מומלץ להשתמש ב- deferrable constraints:

  1. מכיוון שלעיתים יכולה להיות הפרה של ה- constraint,  אורקל יתנהג אחרת אם קיים constraint שמוגדר deferrable. למשל, כאשר מגדירים unique constraint, אורקל יוצר unique index אוטומטית. אם ה- constraint מוגדר כ- deferrable עלולים להיות מצבים שבהם יש רשומות כפולות ולכן אורקל במצב זה ייצור אינדקס רגיל ולא unique.
  2. מאותה סיבה ה- optimizer אינו יכול לבצע או להניח דברים מסויימים (כמו לבצע unique scan או להניח שלכל רשומת בן ב- foreign key יש רשומת אב).
  3. במידה ויש בעיה במידע ואנחנו מפרים constraint, את הודעת השגיאה נקבל רק בזמן ה- commit כך שהרבה יותר קשה לעקוב אחרי התהליך ולהבין היכן ה- constraint הופר.

Enable and Validate

כאשר יוצרים constraint על טבלה קיימת, צריך להתייחס גם למידע שקיים כבר בטבלה וגם למידע חדש שיתווסף אליה. על מנת להגדיר איך יתנהג ה- constraint נשתמש במאפיינים enable או disable ו- validate או novalidate:

–          Enable validate – כברירת מחדל, אורקל מוודא שהמידע שנמצא בטבלה אינו מפר את ה- constraint והוא יאכוף את ה- constraint על כל מידע חדש שייכנס לטבלה.

–          Enable novalidate – אורקל מניח שהמידע שקיים כבר בטבלה תקין ואינו בודק אותו, אבל אוכף את ה- constraint על מידע חדש שייכנס אליה.
יש להזהר ממצבים בהם המידע שבטבלה כן מפר את ה- constraint מכיוון שזה יכול ליצור בעיות רבות.

–          Disable validate – הגדרה זו יעילה עבור מערכות DHW. ה- constraint אינו פעיל אבל מכיוון שהוא מוגדר כ- valid אורקל מניח שהוא תקין. במקרה זה אין אפשרות לעשות פעולות DML מול הטבלה למעט SQL*Loader ו- exchange partition.

–          Disable novalidate – במקרה זה ה- constraint מוגדר אך אינו נאכף כלל.

Rely and Norely

כאשר קיים constraint, ה- optimizer יכול להשתמש במידע הזה על מנת לייעל שאילתות מסויימות. דוגמא פשוטה יכולה להיות check constraint שמאפשר רק ערכים של true או false לעמודה מסויימת. שאילתא ששואלת כמה ערכי valid יש בטבלה, אינה צריכה לגשת לטבלה או לאינדקס כלל, כי לפי ה- constraint אנחנו בטוחים שאין את הערך valid אלא רק true או false, וניתן להחזיר מיידית את התשובה 0.

במידה וקיים constraint שנמצא במצב novalidate, אורקל אינו אוכף אותו ולכן ה- optimizer לא יכול להשתמש בו על מנת לשפר שאילתות. אם אנחנו יודעים שהמידע תקין ומעוניינים שה- optimizer יתיחס ל- constraint למרות שהוא נמצא במצב novalidate, אנחנו יכולים להגדיר את המאפיין rely על ה- constraint.

ברירת המחדל ל-  constraint-ים במצב novalidate הוא norely.

Exceptions

כאשר יוצרים constraint על טבלה קיימת, יכול להיות מצב שבו המידע שקיים בטבלה מפר את ה- constraint. במצב זה אורקל יחזיר הודעת שגיאה ולא ייצור את ה- constraint. הבעיה היא למצוא אילו רשומות הפרו את ה- constraint. לשם כך אפשר להשתמש ב- exceptions into בעת יצירת ה- constraint (לאחר שיצרנו טבלת exceptions מתאימה על ידי הסקריפט ORACLE_HOME/rdbms/admin/UTLEXCPT.SQL). יצירת ב- constraint עדיין תיכשל, אבל מידע על הרשומות הבעייתיות ייכנס לטבלה ונוכל לתקן את הבעיה לפני שננסה ליצור את ה- constraint שוב.

סיכום

Constraints הם אובייקטים שימושיים ומאפשרים לנו לשמור על data integrity במערכות שלנו. ברשומה זה סקרנו לכם מספר מאפיינים מתקדמים בנושא Constraints.

נתראה ברשומה הבאה!

לירון אמיצי

The following two tabs change content below.
ירון אמיצי הוא סמנכ"ל שירותי מומחה בחברת בריליקס ו-DBA בכיר בעל נסיון של למעלה מ- 15 שנים. ללירון תואר Oracle Ace ומתמחה בנושאי ביצועים, תשתיות, פתרונות זמינות גבוהה, גיבויים ושחזורים. ללירון יש גם בלוג עצמאי בכתובת: https://amitzil.wordpress.com

השאר תגובה:

שם (חובה):
אימייל (לא יפורסם) (חובה):
תגובה (חובה):

*



מאמרים קשורים

Baruch Osoveskiy

תיקון מהיר לדיסק איטי

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

OS Background operations

אורי לרנר בטיפ קצר ושימושי על העברת פעולות לרקע במערכת [...]
רשימת

רשימת הפיצ'רים החדשים של אורקל 12.1

אורקל פרסמו את הספרות הרשמית לגרסה 12.1 שיצאה לאחרונה וזמינה להורדה. בין שאר הספרים (החשובים כל אחד שלעצמו), פורסם הספר המסקרן ביותר בעיני – Oracle Database 12c Release 1 (12.1) New Features. זהו ספר שראוי שכל DBA [...]
גרסת

גרסת אורקל 12c זמינה להורדה

בשעה טובה ולאחר המתנה סופר ארוכה, גרסת אורקל 12c (גרסה 12.1) זמינה סוף סוף להורדה רשמית מהאתר של אורקל. הגרסה החדשה מנסה לתת פתרונות לעולם ה"ענן" – ומוסיפה פיצ'רים חדשים שבאים לתת מענה בדיוק [...]
Copyright 2019 ilDBA Portal. Brought to you by Brillix - Israel Leading DBA company. Sponsored by: DBSnaps - Database Video Tutorialss
Website Security Test
%d בלוגרים אהבו את זה: