none
בעיה עם FileStream ב SQL Server RRS feed

  • שאלה

  • שלום לכולם,

    אני מריץ סקריפט T-SQL אבל משום מה הוא עובד רק כאשר מפעילים אותו משרת הDB 

    במיקום של הקובץ מעבירים כ-UNC PATH   -  \\computer_name\shared_direcory\file_name    במשתנה RepFilePath@

    כאשר מפעילים את ה- sp  משרת Application Server  מקבלים שגיאה – אין גישה לקובץ (שורה EXEC sp_executesq)

    ///////////////////////////////////////////////////////////////////////////////////////////////////////
    
    ALTER PROCEDURE [dbo].[spSetReportText]
         @ReportID int,
         @RepFilePath varchar(255)
    AS 
         DECLARE @img AS VARBINARY(MAX)
         DECLARE @sql NVARCHAR(MAX)
         DECLARE @parmsdeclare NVARCHAR(4000) 
    
         SELECT user_name();
    
         SET NOCOUNT ON 
    
         SET @sql = 'SELECT @img = CAST(bulkcolumn AS VARBINARY(MAX)) FROM OPENROWSET(BULK ''' + @RepFilePath + '''
                     ,SINGLE_BLOB ) AS x'
    
         SET @parmsdeclare = '@img VARBINARY(MAX) OUTPUT' 
    
         EXEC sp_executesql @stmt = @sql
                            , @params = @parmsdeclare
                            , @img = @img OUTPUT  
    
         IF NOT EXISTS(SELECT RepID FROM tblRepFile WHERE RepID = @ReportID)
         BEGIN
              INSERT INTO tblRepFile (RepID, Id, FileData)
              SELECT @ReportID, NEWID(), @img
         END
         ELSE
         BEGIN
              UPDATE tblRepFile
              SET FileData = @img
              WHERE RepID = @ReportID
         END
    

    היוזר שמריץ בשרת הDB ובשרת האפליקצייה הוא אותו יוזר.

    זה מאוד מוזר הרי פקודת SQL נשלחת בכל מקרה לשרת הDB.
    האם זה משנה מאיזה שרת מפעילים sp ?
    מה ניתן לעשות כדי שהפקודה יעבוד משרת Application Server ?

    כל עצה תעזור לי...
    תודה מראש 

    יום שלישי 27 אוקטובר 2015 12:05

תשובות

  • אתה יכול לבדוק מי המשתמש שמריץ בפועל את השאילתה ותגלה אולי שאתה טועה :-)

    המשתמש שממתחבר למסד הנתונים הוא לא בהכרח המשתמש שמריץ את השילתה והשדברים קצת מורבים יותר במקרישם שמנסים להריץ פרוצודורות מובנות שונות כמו למשל sp_executesql או xp_cmdshell (החוקים לא זהים בכל מצב). יש לי בלוג כמעט מוכן שהתכוונתי לפרסם בנושא זה בדיוק לגבי xp_cmdshell. בכל מקרה לגבי שאילתות דינאמיות יש מאמר מאוד מעמיק בנושא שכתב Erland Sommarskog (הוא אחד המנהלים בפורומים של MSDN בממשק העולמי... אנחנו מנהלים בכמה פורומים ביחד שם, ובהחלט אני יכול להגיד שיש לו ידע מעמיק מאוד). מומלץ לקרוא את כל המאמר! הקישור שאני שם מקפיץ ישירות לנושא של הבעיה שלך, אבל אני חוזר ואומר שכדאי לקרוא הכל לעומק :-)

    http://www.sommarskog.se/dynamic_sql.html#permissions

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


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]    [Linkedin]


    • נערך על-ידי pituachMVP, Moderator יום רביעי 28 אוקטובר 2015 02:56
    • הוצע כתשובה על-ידי pituachMVP, Moderator יום שישי 25 דצמבר 2015 15:49
    • סומן כתשובה על-ידי Netanelf יום רביעי 16 מרץ 2016 14:26
    יום שלישי 27 אוקטובר 2015 16:29
    מנחה דיון