Recovery Models

27/02/2012

פוסט זה עוסק בדרך בה ניתן לגבות את הדטבייסים ולשחזר אותם בכפוף לאופן בו הם מוגדרים. אנחנו אמורים לכלכל מעשינו כך שכשקורית תקלה במערכת המידע- נהיה ערוכים לקראתה במידת האפשר, ונהיה מסוגלים להחזיר את המערכת לפעולה תקינה במהירות סבירה. כמובן שלכל דבר יש מחיר במשאבים, ביצועים, עבודה וכו'; ומנגד הצרכים יכולים לנוע בין מערכות קריטיות שאסור בשום פנים ואופן שיושבתו לבין כאלו שחשיבותן שולית ואין צורך להקדיש להן תשומת לב מיוחדת. לצורך כך יש טכנולוגיות שונות שבהן מככבים מושגים כמו High Availability (מניעת השבתה של המערכת), Data Recovery (התאוששות מהירה במקרה של תקלה) ועוד. ...

שליפה אקראית של שורות מטבלה בגרסת 2012

24/02/2012

לפני כשבועיים כתבתי פוסט לגבי שליפה אקראית של שורות מטבלה, ולמרבה הצער היו שתי אפשרויות שלכל אחת חסרונות משלה: 1. שימוש במיון בעזרת New_ID שמחזיר את התוצאה המבוקשת אבל כרוך במיון של טבלה שעלולה להיות גדולה מאוד. 2. שימוש בכלים מובנים של SQL Server ש”עולים” פחות אבל מחזירים מספר שורות שלא ניתן לצפות מראש במדוייק. גרסת 2012 שעומדת להשתחרר ב-07/03/2012 כוללת את אופציית ה-Paging שיכולה לסייע לנו במקרה זה: נשלוף 20 שורות (או כל מספר אחר) החל מנקודה אקראית בטבלה. המחיר יהיה פניה לטבלת המערכת sys.sysindexes כדי לברר כמה שורות...
אין תגובות

כיצד ניתן לבצע Cut & Paste לנתונים מטבלה לטבלה?

23/02/2012

Ctrl X & Ctrl V כנראה לא יעבוד, אבל השימוש באופרטור Output יספק את הסחורה. ניצור להדגמה טבלה אחת עם כמה רבבות שורות, וטבלה שניה ריקה אליה יש להעביר את הנתונים מהראשונה: Use tempdb; Go   If Object_Id('messages','U') Is Not Null Drop Table messages; Go   Select * Into messages From sys.messages;   If...
תגיות: , , , ,
אין תגובות

Indexed Views וכמה Clustered Indexes ניתן ליצור על טבלה?

22/02/2012

מהם Indexed Views? כיצד יוצרים אותם? מה התועלת בהם? אילו יתרונות, מגבלות, חסרונות וחלופות יש להם? ולבסוף- האם ניתן ליצור יותר מ-Clustered Index אחד על טבלה? (ספויילר: התשובה היא "לא, אבל..") מגרסת 2005 יש אפשרות ליצור אינדקסים על Views, או ליתר דיוק- ליצור Views כך שיהיה ניתן ליצור עליהם אינדקסים. ניצור לצורך ההדגמה טבלה, ניצור עליה Clustered Index, ניצור View על הטבלה, וניצור גם עליו Clustered Index אבל שונה: Use tempdb; Go   ...

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

21/02/2012

הנה מקור לטעויות: מנסים לעדכן טבלה אחת על פי השניה, בשעה שלכל שורה בראשונה יש מספר שורות מתאימות בשניה. עוד לפני שנראה מה קורה- ברור שלא זה הדרך: בין אם הפקודה תעבוד ובין אם לא- כיצד נדע איך הטבלה הראשונה תתעדכן? לאחר שנראה מה קורה נבין שכל שורה תתעדכן פעם אחת באופן אקראי, וכך לא עובדים. דוגמה: Use tempdb; Go   If Object_Id('MyTbl1','U') Is Not Null Drop Table MyTbl1; ...
תגיות: , , ,
אין תגובות

בעיות Collation בפונקצייה Concat

19/02/2012

גרסת SQL Server 2012 מביאה לא מעט חידושים משמחים, ואחד מהם הוא הפונקציה Concat שמשרשרת מספר מחרוזות למחרוזת אחת, בדומה לשימוש באופרטור + לשירשור, אך באופן ידידותי יותר: אין צורך להפוך מספרים ותאריכים לטקסטים בעזרת Cast וגם לא להמיר ערכי Null למחרוזות ריקות פן יהפכו את השירשור כולו ל-Null (מקווה שהבעיות שציינתי שנפתרו- מוכרות). בהחלט שווה! דא עקא שפתרו הרבה בעיות קיימות, אבל הכניסו בדלת האחורית בעייה חדשה שלא הייתה קיימת עד כה. נניח שאנחנו רוצים לקבל מדטבייס ReportServer רשימת טבלאות עם שם הסכימה משורשרת אליהן כמקובל, ופונים...
אין תגובות

פתרון חידת המשולשים באמצעות TSQL

18/02/2012

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

Impersonation: מי מפעיל את הפרוצדורה?

17/02/2012

פרוצדורות וסקריפטים אחרים כוללים אופציה לבצע אותם בזהות אחרת בעזרת אופציית Execute As, בעיקר בשל בעיית הרשאות. ננסה לראות איך זה נראה "מבפנים".. ניצור Login ולו User עם הרשאות חלקיות, בשעה שאנחנו (כלומר- אני, זה שמריץ את הקודים עם ה-Login וה-User שהוגדרו לי) עם הרשאות sa בשרת ו-dbo בדטבייס בו נעבוד (tempdb), ולמי שלא זוכר- Login הוא אובייקט ברמת השרת ואף הדומיין כולו, ו-User הוא אובייקט ברמת הדטבייס שמייצג בדרך כלל את ה-Login: Use tempdb; Go ...

השימוש בטריגרים

14/02/2012

טריגר על פעולות DML בטבלה הוא כלי מוכר יחסית, אך לא כל האופציות מוכרות; ואולי מתבלבלים לעיתים בינו לבין טריגרים אחרים. הפוסט הזה עוסק בטריגרים על טבלאות שמופעלים בעקבות ביצוע פעולות Delete / Update / Insert בטבלה עליה הם הוגדרו. הטריגרים אינם מופעלים בעת ביצוע פקודת Select או Truncate, שינוי סכימה של טבלה, או כל שינוי שהוא באובייקטים של המערכת; ולכל אלו יש פתרונות אחרים. כדי לפשט את הדוגמאות- אשתמש בכל פעם בטבלה אחת בלבד, והטריגרים יפעילו פקודות Print או Select כדי להמחיש את הפעולה שלהם. במציאות הטריגרים אמורים להפעיל בדרך כלל פקודות Insert לטבלת לוג...

חישוב מכפלת ערכים בשליפת Group By

12/02/2012

ב-TSQL יש פונקציית Sum לסיכום ערכים, אך אין פונקציית Product לכפילתם. כיצד נחשב איפוא מכפלה של ערכים בשליפת Group By? הזכרתי בעבר את הפתרון שלמדתי מאב"ג ושהוא עצמו למד מאחרים, ומדי פעם אני נאנח בצער על שלא אני המצאתי את הפטנט הזה: כשלמדתי בתיכון לפני קרוב ל-40 שנה מחשבוני הכיס רק הופיעו, אנחנו היינו כחולמים כשראינו שהם מסוגלים לחבר 1 ועוד 1 ולהחזיר את התוצאה 2, והמשוכללים שבהם כללו פונקציות כמו שורש והראו שהשורש הריבועי של 9 הוא 2.9999999 (בערך).. לשיעורי חשבון הגענו מצויידים בלוח לוגריתמים- חוברת שכלל טבלאות לוגריתמים של מספרים, וטבלאות סינוס/קוסינוס/טנגנס...
תגובה אחת