מבקש עזרה במחיקת שורה מטבלה

מבקש עזרה במחיקת שורה מטבלה

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

Juventini1

New member
DELETE TOP 1

היי תמסח,
בהנחה שאתה עובד עם גרסת SQL Server שהיא חדשה יותר מ- SQL 2000, אתה יכול להשתמש באופרטור TOP. פשוט תריץ את השאילתה (לא לשכוח להוסיף את התנאים ב- Where) בסגנון הזה: DELETE TOP 1 FROM Mytable WHERE
אני ממליץ לך להבא, כאשר אתה מריץ עדכון לפתוח טרנזקציה, לבצע את העדכון, לבצע שליפה לראות שאכן התקבלה התוצאה המובקשת, ואז לעשות Commit, במידה והתקבלה תוצאה לא רצויה פשוט לעשות Rollback. מקווה שעזרתי...
 

pitoach

New member
יש כאן סתירה קטנה בהצעה שלך אני חושב

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

Juventini1

New member
אין כאן שום סתירה!

היי פיתוח,
אם אתה מבצע את הפעולות שציינתי (פתיחת טרנזקציה, עדכון, שליפה לבדיקה, ו- Commit או Rollback) באותו ה-Session. אז אתה לא נועל, ולא קורא "קריאה מלוכלכת" משום שאתה זאת תחת אותה טרנזקציה. תעשה ניסוי בעצמך ותראה זה עובד.
 

pitoach

New member
ברור אתה מקבל נתונים מלוכלכים

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

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


כמו שכתבתי אני עדיין חושב שיש כאן סתירה (המטרה ב SELECT היא לבדוק מה בוצע בעדכון להבנתי), אבל אם זה מתאים לאפיון שלך ולא נוצרת לך סתירה עם הצרכים שלך מה טוב
 
למעלה