sql - server - אילוץ נתונים

channaca2

New member
sql - server - אילוץ נתונים

אני עוד ירוקה בענף, אודה לכם מאוד אם תעזרו לי. בסיס הנתונים שברשותי הוא sql - server. אני מעונינת ליצור אילוץ שבכל הכנסה או עידכון (באופן ידני/יבוא קובץ/ ע"י stored procedure) לטבלה מסוימת אם ערכו של שדה x הוא 1, גם ערכו של שדה y יהיה חייב להיות 1. איך יוצרים אילוץ כזה? (אם השדה y לא מתאים: 1. איך להפוך את ערך שדה Y ל-1 ולקלוט את הרשומה? 2. איך להודיע הודעת שגיאה ולא לקלוט את הרשומה?) מהי הדרך לעשות זאת? תודה מראש
 
צריך להגדיר את הדרישות יותר טוב

עם שדה X שונה מ1 מה אמור להיות הערך של שדה Y? האם מותר למשתמש לשנות את הערך של Y או תמיד השדה Y הוא שדה מחושב? במידה שמותר למשתמש לבצע שינויים בערך של השדה, האם צריך לבטל את שינוי הערך של Y בלבד, כאשר X שונה מ1 או שצריך לבטל את כל השינויים ברשומה/טראנסאקציה?
 

channaca2

New member
הגדרת הדרישות

השדה y אינו מחושב אוטומטית ויכול להיות 0/1. רק במקרה שהשדה x=1 גם השדה y חייב להיות 1. אם נערך שינוי אשר גרר סתירה (x=1 וy=0 ) ברצוני לדעת: 1. כיצד לשנות את הערך y ל1 באופן אוטומטי. 2. כיצד לבטל את השינוי כולו (הכנסה/עדכון).
 
מספר הערות

השדה Y בהחלט עושה רושם של שדה מחושב, שלא אמור להיות שדה בטבלה.  הערך של השדה לא עומד בפני עצמו, ולמעשה אפשר לדעת את ערכו המדויק לפי הערך של השדה X.

אם את עדיין מעוניינת להכליל את השדה Y בטבלה (אני מאד ממליץ לא להכליל), לא תוכלי לשלוט על הערך באמצעות check constraint.  במקום שימוש בconstraint יש לך 2 אפשרויות.  אפשרות אחת היא להישתמש בtrigger או בinstead of trigger, ושם לבדוק את הערכים של X וY ולהחליט בקוד מה לעשות - האם להמשיך את הפעולה, לבטל את הפעולה או לשנות את הערך של השדה Y.  במקרה הזה יש עדיפות לinstead of trigger, כי הפעולה מתבצעת פעם אחת או לא מתבצעת בכלל, בניגוד לtrigger שבו הפעולה המקורית תמיד מתבצעת ואח"כ אולי יש פעולת update נוספת או פעולת rollback (תלוי בקוד שלך).

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

ziv98

Member
קצת מהר מידי הפכת את Y למחושב...

מה ערכו אם X=0 ?
מי אמר (למרות שזה אני מסכים שדי נראה) ש - X חייב להיות 0/1 ?

אני לא ממש יודע לחשב "את ערכו המדוייק לפי הערך של X".
 
אז תתייחס אליו כאל שדה לא מחושב

האמת שלא ממש בא לי להתווכח אם השדה מחושב או לא מחושב.  לפי הבנתי כאשר X שווה 1 אז Y חייב להיות שווה 1. 2 הערכים היחידים של השדה הם 0 ו1.  יכול להיות שכאשר X שונה מ1, אז y יכול להיות 0 או 1.  במקרה כזה  לא מדובר על שדה מחושב.  לעומת זאת יכול להיות שבכל מקרה שבו X שונה מ1, שדה Y צריך להיות 0.  במקרה כזה מדובר על שדה מחושב.  אני מניח שchannaca2 יודעת על איזה מקרה מדובר.  היא גם יודעת אם טעיתי או לא.
 

channaca2

New member
תודה.

תודה.

אנסה להשתמש בtrigger או בinstead of trigger .

אם לא אסתדר אבקש שוב את עזרתך.

תודה תודה.
 
למעלה