Distributed Transaction: שימוש בטרנזקציות וב-Linked Server

יום שלישי, דצמבר 23, 2014

הנדון: טיפול בטרנזקציה המתפצלת לעוד שרת.המצרכים: שני שרתים, ו-Linked Server מהאחד לשני (אצלי הוא נקרא GeriTo), כאשר יש לוודא שה-RPC מאופשר (היכולת להריץ פרוצדורות דרכו ולא רק פקודות Select): נתחיל מהמקרה הפשוט בו יש טרנזקציה בצד השני ולא במקומי, ולכן היא לא “עוברת” דרך ה-Linked Server.ניצור בצד השני טבלה ופרוצדורה שמכניסה לתוכה נתונים: Use tempdb;Go If Object_ID('MyTbl','U') Is Not Null Drop Table MyTbl;Go Create Table MyTbl(ID Int Primary Key);Go If Object_ID('MyProc','P') Is Not Null Drop Proc MyProc;GoCreate Proc MyProc @ID Int AsBegin TryBegin TranInsert Into MyTbl Values(@ID);CommitEnd TryBegin CatchPrint '@@ServerName=, DB_Name()=, '+IsNull(Object_Name(@@ProcID),'פרוצדורה לא ידועה')+': Error_Procedure()='+IsNull(Error_Procedure(),'פרוצדורה לא...
אין תגובות

הודעות שגיאה: השימוש ב-RaisError וב-Throw

יום חמישי, ינואר 13, 2011

הקדמה: לקבל הודעות שגיאה לא מסובך, והמערכת "מפנקת" אותנו בכאלו על ימין ועל שמאל: בעיות בחומרה, בעיות בתוכנה, באגים של מיקרוסופט, באגים שלנו, שימוש שגוי על ידי המשתמשים.. השימוש ב-RaisError והחל מהגרסה הבאה - גם ב-Throw - מאפשר למתכנת ה-SQL ליזום הודעות שגיאה בעצמו. במה דברים אמורים? נניח שבנינו טבלה, הגדרנו לה מפתח ראשי, וכעת אם מישהו מנסה להכניס בכל דרך שהיא מפתח קיים לטבלה- הוא מקבל הודעת שגיאה. באופן דומה ניתן להגדיר Rules ו-Constraints מסוגים שונים לשמירה על איכות הנתונים ברמת הטבלה. לעיתים נרצה להגן על הנתונים באופן פרואקטיבי ולבדוק אותם לפני הכנסתם לטבלה, כדי...
אין תגובות

טרנזקציות, שגיאות ושגרות שגיאה: השימוש באופציית Xact_Abort ובפונקציה Xact_State

יום שני, אוגוסט 23, 2010

האופציה Xact_Abort מגדירה אם בשעת שגיאה לעצור את הריצה ולבצע Rollback לטרנזקציה (On) או לא (Off), כאשר האופציה השניה היא ברירת המחדל. הפונקציה Xact_State קובעת האם יש טרנזקציה פתוחה (1) או אין טרנזקציה פתוחה (0); וכן האם יש טרנזקציה פתוחה שלא ניתן לבצע לה Commit אלא רק Rollback בשל שגיאה (1-). דוגמה 1 – ניצור טבלה עם Primary Key (אסור להכניס ערכים כפולים), ונראה מה קורה במקרה של Xact_Abort Off (ברירת החמדל): Use tempdb; Go If Object_Id('T','U') Is Not Null Drop Table T; Go Create Table T(A Int Not Null Primary Key); Go Set Xact_Abort Off;--ברירת מחדל Select 1 N, 'Before...

האח הגדול עינו פקוחה (6)- זיהוי עצמי בזמן ריצה

יום רביעי, יוני 9, 2010

לפרוצדורה MyProc שרצה בדטבייס MyDB בשרת MyServer אין בעייה "לדעת" מי והיכן היא, אלא שלעיתים אנו מוסיפים לאובייקטים תכנותיים כמו פרוצדורות או טריגרים או ג'ובים שגרות שגיאה סטנדרטיות או דיווחים סטנדרטיים  שכוללים כתיבה לטבלת Log, ואנחנו מחפשים דרך להימנע מהצורך לשנות בכל אובייקט את תוכן הפקודה (פקודה כזו בוודאי תכלול את שם הפרוצדורה בתוכה היא רצה). חשוב להדגיש כבר כאן שזה יהיה רעיון לא מוצלח אם מדובר באובייקטים פשוטים שרצים מספר רב מאוד של פעמים, ומחיר עדכון טבלת הלוג עלול ליצור עומס בלתי נסבל (לגבי מעקב שגיאות- נניח באופן אופטימי ששגיאות לא קורות בכל יום :-)). ...