stored procedure

AvidaEinav

New member
stored procedure

שלום, האם ישנה אפשרות להריץ stored procedure לא בצורה סימולטנית, כלומר אם אני כרגע מריץ ולא סיימתי אז אתה לא יכול להריץ, חשבתי ליצור טבלה עם שדה אחד מסוג ביט וכל כניסה ל stored procedure לבדוק אם הוא 0/1 (כמובן שאם הוא 0 אז אני נכנס ומשנה אותו ל 1 וביציאה מחזיר ל 0), אך תהיה לי בעיה להתמודד עם דבר כזה ברגע שעוצרים את ה stored procedure או ברגע שמאתחלים מחדש או עושים כל דבר דומה לסרבר.. האם קיימת הגדרה מסויימת שאוכפת את הדרישה הזאת? אני עובד על SQL SERVER 2008R2 ה stored procedure בעיקרון רץ מתוך JOB אבל אפשר להריץ אותו גם manually. המון תודה..
 

AvidaEinav

New member
בעיה שהתעוררה

היי, כאשר הרצתי את הדוגמה שלך ב 2 לשוניות שונות (כמו שאתה עשית..) ועצרתי בכוונה את מה שהופעל ראשון (אחרי שרכש את הנעילה אבל לא שיחרר) ההרצה השניה לא הצליחה לרוץ ולרכוש את הנעילה. ושום הרצה מחודשת אח"כ לא הצליחה.. ההרצות היחידות שכן הצליחו הן הרצות שבאו מתוך הלשונית הספציפית שאותה עצרתי, יש לך מושג מה הולך שם? והאם במצב של הפסקת הרצה בין אם זה ידני ובין אם הסרבר קרס ועשה הפעלה מחדש, יש דרך "לטפל" בזה? תודה רבה..
 

גרי רשף

New member
בלי לבדוק (הערכה מה קרה)

עצרת באמצע, הטרנזקציה נשארה פתוחה, ולכן רק בחלון בו היא פתוחה ניתן היה להמשיך לעבוד. אם היית מריץ באותו חלון את הפקודה Rollback (סיום וביטול הטרנזקציה) הכל היה משתחרר אצל כולם. כמובן שבאופן מעשי הפתרון הוא אחר- יש להשתמש ב-Try & Catch ולשחרר את הטרנזקציה במקרה של שגיאה.
 

AvidaEinav

New member
הערכה נכונה

זה בדיוק מהשניסיתי ליצור מקרה קצה שבו הטרנזקציה לא מסיימת את העבודה שלה כמו שצריך ובכך לא משחררת את הנעילות.. לגבי ה Try & Catch, אם יש רעיון אחר,זה עדיף..יש פרוסס מאוד כבד על המידע ואני לא רוצה שהוא יגיע ל Log File. תודה על התשובות המהירות.
 

AvidaEinav

New member
מעבר לכך

על סמך נסיונות שאני עושה.. הפסקת יזומה של שאילתה,לא ניתפסת כ error ולכן לא תגיע ל catch מה שאומר שהנעילה לא תשתחרר לי.
 

AvidaEinav

New member
פיתרון!!!

הפתרון הבא מוודא חד משמעית אם SP מסויים רץ או לא, ולא משנה מאיפה אתה מפעיל אותו או אם עצרת אותו באמצע או עשית RESTART או מה שלא יהיה!!! אני בטוח שזה יעזור להרבה...
 

AvidaEinav

New member
הקוד..

CREATE PROCEDURE sp_ENTER_YOUR_NAME ( @DbName VARCHAR(30) , @SpName VARCHAR(30) , @IsLockt BIT OUTPUT ) AS SET NOCOUNT ON; DECLARE @DBId SMALLINT SELECT @DBId = DB_ID(''+@DbName+'') DECLARE @SpNameForQuery VARCHAR(50) = 'CREATE PROCEDURE '+@SpName DECLARE @RowNumber SMALLINT = 0 SELECT @RowNumber = COUNT(*) FROM ( SELECT dest.* FROM sys.dm_exec_requests AS deqs CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) AS dest WHERE LEFT(dest.TEXT,LEN(@SpNameForQuery)) = @SpNameForQuery AND dest.TEXT NOT LIKE '%WHERE dest.TEXT LIKE%' AND dest.dbid = @DBId ) tbl SET @IsLockt = CASE WHEN @RowNumber = 0 THEN 0 ELSE 1 END
 

AvidaEinav

New member
חיובי

ניסיתי למצוא הגנה ל SP מסויים שעושה REPLICATION ממקום אחר(ע"י JOB או הפעלה ידנית), שלא יוכל להיווצר לי כפילויות וטעויות. ההצעה שהצעת (SP_GetAppLock) לא סיפקה את הסחורה במצב שאני מפעיל את ה SP ועוצר אותו באופן יזום לפני שהגיע לפקודת שחרור הנעילה ובכך בעצם נעל לי את ה SP. גם הקפה ב TRY ו CATCH לא עזרה (גם לא היתה רלוונטית במצב הנתון) מכיוון שהפסקת השאילתה באופן יזום או הפעלה מחדש של השרת באופן פתאומי, לא נחשבת להרמת שגיאה.. ולכן נעזרתי ב DMV לשם פתרון הבעיה - מה שעובד מצויין כרגע.. האם ישנה בעייה בכך?
 

גרי רשף

New member
לא עולה בדעתי שום בעייה והרעיון יפה


 
למעלה