מניעת חריגות מערכים אפשריים בעמודות Identity וב-Sequences

יום שלישי, אוקטובר 25, 2016

לעמודות בטבלאות יש מגבלות של גובה הערכים (בעמודות מספרים או תאריכים) או של אורך מחרוזות (בעמודות טקסטואליות), ובדרך כלל תקלות אמורות להימנע באופן אפליקטיבי.הפוסט הזה מטפל במניעת חריגות בעמודות Identity וב-Sequences: למשל, הגדרנו עמודת Int כ-Identity, הערך בעמודה הולך וגדל, וקצת אחרי 2 מיליארד הגענו לגבול העליון של Int. כשזה יקרה הקוד שינסה להכניס נתונים לטבלה יפול, והטיפול עלול להיות מורכב: שינוי העמודה (כולל הנתונים בה), שינויים במשתנים בפרוצדורות שמטפלות בה, שינויים ברפליקציות ועוד. סיפור שלם!תרומתי הצנועה למערכה היא סקריפט שמציג את הערכים הנוכחיים לצד הערכים המקסימליים האפשריים, בכל האובייקטים הרלוונטיים: Declare @SQL Varchar(Max);Select ...
אין תגובות

מידע לגבי ערכי Identity

יום חמישי, אפריל 10, 2014

Identity@@ ו-()Scope_Identity מחזירים את ערך ה-Identity האחרון שהוכנס לטבלה ב-Session בו אנו נמצאים,ו-(‘..’)Ident_Current מחזיר את ערך ה-Identity האחרון שהוכנס לטבלה בכלל (גם ב-Sessions אחרים).עשויים להיות הבדלים בין שני הראשונים כשמדובר במקרים מורכבים כמו פעולת Insert לטבלה אחת שמפעילה טריגר שמכניסה שורות לטבלה אחרת, אך לא אכנס לזה כאן, וכפי שנראה – במקרים פשוטים אין בינהן הבדלים. ניצור טבלה ובה עמודת Identity: Use tempdb; If Object_ID('T1') Is Not Null Drop Table T1; Create Table T1(ID Int Identity, I Int); נבדוק מה ה-Identity: Select @@Identity , ...
אין תגובות

מספור שורות בטבלה

יום חמישי, ינואר 31, 2013

פנה אלי פלוני בשאלה כדלקמן: יש לו טבלה אליה הוא מכניס שורות בעזרת פרוצדורה בכל פרק זמן נתון, והוא רוצה למספר אותן. נניח שהוא הכניס שורות ביום ובשעת כתיבת שורות, אזי בעמודת התאריך יהיה כתוב 29/01/2013 07:29:15, והוא רוצה בנוסף שהשורות של תאריך זה יהיו ממוספרות. הוא מכיר את אופציית ה-Identity ליצירת מספור אוטומטי, אלא שאופציה זו ממספרת בסדר עולה את כל השורות ולא כל תאריך לחוד.. מה עושים? בניגוד לפוליטיקאים שעונים על השאלות המופנות אליהן ב-"לא זו השאלה אלא.." ומנסחים שאלה חלופית עליה יש להם תשובה מן המוכן, אני משתדל לענות קודם כל לגופו של...
אין תגובות

כיצד מתנהגת עמודת Identity בעת פעולת Insert ממספר מקורות?

יום רביעי, מאי 9, 2012

בפורום בסיסי נתונים בתפוז הופיעה שאלה- כיצד לזהות או לשלוף את ערכי ה-Identity שהוכנסו בפעולת ה-Insert האחרונה. כל עוד מדובר בערך בודד- ניתן להשתמש במשתנה המערכת @@Identity, אך מה קורה כשמדובר במספר ערכים? חשבתי לתומי שניתן להיעזר ב-@@Identity הנ"ל וב-@@RowCount המציין כמה שורות התווספו באותה פעולת Insert וכך לשלוף במישרין (על ידי Select Top ומיון הפוך) או לחשב בעקיפין (בהינתן ה-Increment של ה-Identity) את הערכים, אל שנאמר לי (ובצדק כפי שהתברר לי בדיעבד) שאם הטבלה תעודכן בו זמנית משני מקורות שונים זה לא יעבוד. האומנם? – תהיתי – הרי כל פעולת...
אין תגובות

הכנסת ערכים לעמודת Identity

יום שני, מרץ 12, 2012

עמודות Identity יוצרות בעצמן את הערכים המאוכלסים בהן: ברירת המחדל היא להתחיל מ-1 ולעלות ב-1 בכל פעם (1,2,3,4..), אך ניתן להגדיר Seed ו-Increment שונים. יחד עם זאת- ניתן להכניס ערכים חיצוניים לעמודות Identity ולהתגבר על ההגדרות, בדרכים מסויימות. Use tempdb;Go If Object_Id('MyTbl','U') Is Not Null Drop Table MyTbl;Go Create Table MyTbl(ID Int Identity, Txt Varchar(Max));Go InsertInto MyTblSelect 'First' Union AllSelect 'Second' Union AllSelect 'Third'; Select * From MyTbl; במקרה זה הוכנסו לטבלה שלוש שורות, לא צויינו ערכים לעמודת ה-Identity, ובפקודת ה-Insert לא היה צורך לציין...
אין תגובות

השימוש ב-Surrogate Key (SK) – יתרונות וחסרונות

יום חמישי, דצמבר 16, 2010

יצרנו טבלת עובדים. באיזו עמודה נבחר בתור ה-Primary Key שלה, הנתון שיצביע באופן חד משמעי על העובד בטבלאות המקושרות כ-Foreign Key (ביחס 1:N) או בחיפוש בטבלה? אפשרות שמן הסתם תיפסל מראש היא להשתמש בשם ובשם הפרטי, מכיוון שהם אינם יחודיים בהכרח. אפשרות יותר הגיונית ואשר מיושמת במקומות רבים – מספר תעודת הזהות. במקרה זה לא צפויות כפילויות, אבל תיאורטית צפויות בעיות אחרות- מה יקרה אם נעסיק עובד שאין לו תעודת זהות (נניח- עובד זר)? מה יקרה אם ננסה ליישם זאת במדינות בהן אין תעודת זהות? מה יקרה אם מספר תעודת הזהות ישתנה (נדיר אבל יתכן)? מה יקרה...
אין תגובות

Sequence – מספור אוטומטי משותף

יום ראשון, נובמבר 14, 2010

בעקבות ההכרזה הרשמית על גרסת SQL Server הבאה ששם הקודם שלה הוא Denali – נזכרתי בבעייה שפעם הייתי צריך לפתור וכעת דומה שבאה על פתרונה.. נניח שיש לנו טבלת ספקים וטבלת לקוחות, לכל טבלה יש עמודת Identity הממספרת את השורות באופן אוטומטי, אבל אנחנו מעוניינים שהמספרים בשתי הטבלאות יהיו שונים, וכך המספר 3 (למשל) ישוייך רק לגוף אחד, ולא יווצר מצב בו יש לקוח שמספרו 3 וספק שמספרו 3.. ניתן היה לחשוב על כל מיני פתרונות: 1. טבלה משותפת ללקוחות ולספקים, כשחלק מהעמודות משמשות את שניהם (מספר, שם, כתובת, טלפון, איש קשר..) וחלק לא (% ניכוי במקור – רלוונטי רק לספק, כתובת...
אין תגובות

מספור אוטומטי – עמודת Identity

יום רביעי, אוגוסט 11, 2010

Identity היא תכונה ההופכת עמודה מספרית של שלמים לעמודת מספור אוטומטי, כאשר ניתן להגדיר לה מספר התחלתי (Seed) וקבוע גידול (Increment); וברירת המחדל אם לא הוגדר אחרת - (1,1), כלומר- רצף המספרים הטבעיים החל מ-1. נגדיר שתי טבלאות עם עמודת Identity, ולאחת מהם נוסיף View הפונה אליה: Use tempdb; Go Create Table T1(ID Int Identity); Go Create View V1 As Select * From T1; Go Create Table T2(ID Int Identity(1000,10) Unique Clustered, Shem Varchar(50), ...