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

25/10/2016

אין תגובות

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

Declare    @SQL Varchar(Max);

Select    @SQL=IsNull(@SQL+' Union All'+Char(13),'')+Concat('Select ''',Object_Schema_Name(Cl.object_id),'.',T.name,''' Object, ''Column ',Cl.name,''' ObjectType, Ident_Current(''[',Object_Schema_Name(Cl.object_id),'].[',Object_Name(Cl.object_id),']'') MaxIdentity, Case ''',Tp.name,''' When ''int'' Then 2147483647 When ''smallint'' then 32767 When ''tinyint'' Then 255 When ''bigint'' Then  9223372036854775807 Else Null End UpperLimit')

From    sys.columns Cl

Inner Join sys.types Tp

        On Cl.system_type_id=Tp.system_type_id

        And Cl.user_type_id=Tp.user_type_id

Inner Join sys.tables T

        On Cl.object_id=T.object_id

Where    Tp.name In ('int','smallint','bigint','tinyint')

        And Cl.is_identity=1;

Set        @SQL=Concat(@SQL,' Union All',Char(13),'Select    Concat('''',Schema_Name(S.schema_id),''.'',S.name,'''') Object, ''Sequence'' ObjectType, S.current_value MaxIdentity, S.maximum_value UpperLimit From    sys.sequences S Inner Join sys.types Tp On S.system_type_id=Tp.system_type_id And S.user_type_id=Tp.user_type_id Where    Tp.name=''int''');

Set        @SQL=Concat(@SQL,Char(13),'Order By MaxIdentity Desc;');

Exec(@SQL);

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

בהצלחה!

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *