none
SQL Dynamic Query

    שאלה

  • שלום לכולם!

    יש לי צורך ליצור שאילתה דינמית של select מכל הטבלאות בDB, השאילתה נוצרת רק ע"י מנהל תמיכת לקוחות, כדי שיוכל להכנס לDB ולראות אם יש בעיות.

    אבל למרות הכל אני לא רוצה להשאיר את זה פתוח.

    השאלה שלי, היא, האם זה הגיוני לנעול את הDB לinsert update delete, לבצע את השאילתה, ואז לפתוח אותו שוב?

    בתחילת השאילתה אני פותחת transaction, נועלת הכל, מבצעת את השאילתה, פותחת את הנעילה וסוגרת transaction.

    זה הגיוני? או משהו פה לא נכון?


    alter PROCEDURE [dbo].[System_RunQuery]
    	
    AS
    BEGIN
    DECLARE @MyCursor CURSOR;
    DECLARE @Table_Name nvarchar(50);
    DECLARE @SQL nvarchar(MAX);
    
    BEGIN TRAN T1;  
    SET @MyCursor = CURSOR FOR
        SELECT DISTINCT TABLE_SCHEMA+'.'+TABLE_NAME from Information_schema.columns   
    
        OPEN @MyCursor 
        FETCH NEXT FROM @MyCursor 
        INTO @Table_Name
    
        WHILE @@FETCH_STATUS = 0
        BEGIN
          
    	  
    
    	  SET @SQL = 'create trigger '+@Table_Name+'_LOCKTRIGGER
    	  on '+@Table_Name+'
    	  after insert, update, delete
    	  as
    	  begin
    		ROLLBACK
    	  end'
    
    	  EXEC (@SQL)
    	   
    
    
    	  
          FETCH NEXT FROM @MyCursor 
          INTO @Table_Name
        END; 
    
        CLOSE @MyCursor ;
        DEALLOCATE @MyCursor; 
    
    
    	--run here the code...
    
    
    	SELECT @SQL += 
        N'DROP TRIGGER ' + 
        QUOTENAME(OBJECT_SCHEMA_NAME(t.object_id)) + N'.' + 
        QUOTENAME(t.name) + N'; ' + NCHAR(13)
    FROM sys.triggers AS t
    WHERE t.is_ms_shipped = 0
      AND t.parent_class_desc = N'OBJECT_OR_COLUMN';
    
    EXEC (@SQL);
    
    COMMIT TRAN T1;  
    END
    

    הקוד שצרפתי הוא רק לנעילה ולהסרת הנעילה, והוא עובד!

    השאלה שלי היא אם זה נכון לעבוד ככה.


    תודה!

    שרה.

    יום רביעי 03 מאי 2017 08:53

תשובות

  • תודה על התגובה!!

    רציתי לתת לADMIN של הDB אפשרות לראות את כל הטבלאות שיש בDB, אבל רק לראות אותם.

    מה שעשיתי בסוף, יצרתי DB USER שיש לו הרשאות רק של קריאה ולא כתיבה.

    תודה!

    שרה.

    • סומן כתשובה על-ידי ssfrank יום חמישי 13 יולי 2017 07:08
    יום חמישי 13 יולי 2017 07:08

כל התגובות

  • מי בדיוק אמור להריץ את השאילתה שמשנה את ההרשאות?

    * צריך לזכור את ההבדל בין משתמשים ברמת השרת SQL ומשתמשים ברמת מערכת ההפעלה (או AD)


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

    יום רביעי 03 מאי 2017 11:29
    מנחה דיון
  • שלום שרה,

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

    תוכלי לפרט בבקשה מה הכוונה ב"שאילתה דינמית של select מכל הטבלאות בDB [...] לראות אם יש בעיות."?

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

    כל השאלות האלה ישפיעו על ההחלטה האם זה נכון לנעול את כל הDB או לא.


    Eitan Blumin; SQL Server Consultant - Madeira Data Solutions;

    יום חמישי 13 יולי 2017 07:04
  • תודה על התגובה!!

    רציתי לתת לADMIN של הDB אפשרות לראות את כל הטבלאות שיש בDB, אבל רק לראות אותם.

    מה שעשיתי בסוף, יצרתי DB USER שיש לו הרשאות רק של קריאה ולא כתיבה.

    תודה!

    שרה.

    • סומן כתשובה על-ידי ssfrank יום חמישי 13 יולי 2017 07:08
    יום חמישי 13 יולי 2017 07:08