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

כל התגובות