בעיה בהרשאות בstored procedure

maximon

New member
בעיה בהרשאות בstored procedure

אני עובד בSQL SERVER 2008 R2

ואני מנסה ליצור טבלה ע"י Stored Peocedure ומקבל את הודעת השגיאה הבאה:


Microsoft OLE DB Provider for SQL Server error '80040e14'

Cannot find the object "#TempItems" because it does not exist or you do not have permissions.



הקוד בקובץ המצורף
אני לא מצליח להגדיר את ההרשאה
איך מגירים הרשאה בצורה דינמית (כלומר בstored procedure) ?
 

pitoach

New member
Published: Monday, June 28, 1999

אתה יודע מה קרה משנת 1999 ועד היום ?!?
אתה יודע מה ההבלים בין MS-SQL 5 ל SQL 2012 ?

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

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

אם אתה רוצה להגיע לרמת מיטוב הרבה יותר גבוהה אתה יכול לקרוא את הבלוג הבא (שגם הוא חדש אבל לפחות עדכני לעשור האחרון). זה לא פתרון לבעיה שלך בדיוק אבל יש הרבה נקודות למחשבה שקשורות גם לבעיה:
http://ariely.info/dnn/Blog/tabid/83/EntryId/68/Select-First-Log-entery-row-from-Log-Table.aspx

העניין הבסיסי הוא שאם היה לנו את ה DDL+DML שלך אולי היינו יכולים למצוא את הדרך המיטבית לך. ישנם הרבה מאוד שיטות לחלוקה לעמודים כגון שימוש בפונקציות חלון כמו row_number או rank או שמוש בלוגיקה של מודולו % ועוד...

* בשרתי 2012 ישנם הרבה שיטות נוספות במקרה של חורים לכסות את החורים בלי צורך בעמודה ממוספרת חדשה (למשל עבודה עם lead/lag).


** לגבי השגיאה שקיבלת ובכלל, כדי להבין מה אורך החיים של טבלה זמנית אז כדאי לעבור על הקישור הבא:
http://bisqlserver2005.blogspot.co.il/2008/09/what-is-life-time-of-temporary-table-on.html

אני מקווה שזה יעזור לך מעט,
 

pitoach

New member
דרך אגב אם אתה עובד ב ASP קלאסי או בכלל עם

ADODB הוותיק ולא עם דוט נט אז בכלל יש לך את הכל מובנה בלי שום קשר לשאילתה! וזה היה קיים גם בשנת 2000 דרך אגב

יש 2 פרמטרים מובנים אותם מגדירים ב RecordSet שלך:
PageSize
AbsolutePage
ואז עובדים עם שאילתהרגילה בלי עמודים וה ADODB כבר יודע לבקש את הרשומות המתאימות בלבד.
 

maximon

New member
אני כמובן מכיר אותם ועובד איתם באופן קבוע....

הבעיה היא שאני לא מצליח לעבוד איתם כשאני משתמש בstored procedure

אני מקבל את השגיאה הבאה:

ADODB.Recordset error '800a0cb3'
Current Recordset does not support bookmarks. This may be a limitation of the provider or of the selected cursortype.
 

maximon

New member
זה הקוד שמפעיל את הפרוצדורה ב-asp

כנראה שהוא גורם לבעיה



Set cmd = Server.CreateObject("ADODB.Command")

With cmd
.ActiveConnection = objConn
.CommandType = &H0004
.CommandText = "getAllUsersNumber"
set rs = .Execute
End With
 

maximon

New member
מצאתי פתרון, צריך לכתוב ככה:

With cmd
cmd.ActiveConnection = objConn
cmd.CommandType = &H0004
cmd.CommandText = "getAllUsersNumber"
rs.CursorType = adOpenStatic
rs.CursorLocation = 3'adUseClient
rs.LockType = 3
rs.Open cmd
End With
 

pitoach

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


2 נקודות קטנות:

1. אם אתה רוצה לראות את כל הפרמטרים שאתה יכול לעזות בהם שימוש אתה יכול להיכנס לקישור הבא:
http://www.w3schools.com/ado/ado_ref_recordset.asp
יש הרבה פרמטרים שיכולים למטב את העבודה ב ADO

2. אין סיבה וזה כתיבה לא מסודרת לדעתי להכניס חלק שאינו קשור לפרמטר cmd לתוך החלק של ה WITH. את 4 השורות האחרונות ניתן להוציא החוצה ואם רוצים אפילו לכתוב בתוך WITH של rs. מה המשמעות של cmd.ActiveConnection אם זה במילא בתוך WITH של cmd? יכול להיות שזה מרמז שכדאי לך לעבור על שוב על הפורמט של כתיבה כזו ולהבין למה ומתי כותבים כך
בכל מקרה העיקר שהגעת לפתרון

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