Enjoy Your SQL "Rinfrescare" tutte le Viste di un database - Francesco Quaratino

"Rinfrescare" tutte le Viste di un database

Qualche tempo fa (..2004..) scrissi un post in cui parlavo di un classico fraintedimento legato al funzionamento delle viste di database. Riassumendo, scrivevo che una vista che utilizza la SELECT * non è in grado di riconoscere una modifica intervenuta nella struttura delle tabelle da cui dipende (sia essa l'aggiunta che la eliminazione di colonna).

Nello stesso post proponevo la creazione di una stored procedure che eseguisse la stored di sistema denominata sp_refreshview su tutte le viste di un database facendo uso di un cursore basato sulla sysobjects. Oggi, grazie ancora alla curiosità di un corsista, scopro che:

1) se lanciata su una vista creata WITH SCHEMABINDING la suddetta sp_refreshview restituisce un errore, interrompendo la vecchia "RefreshAllViews" Sad

2) nei BooksOnLine di SQL 2000 non si fa riferimento a questo fatto, nè il messaggio di errore restituito dal Query Analyzer di SQL 2000 (SP3a) chiarisce il motivo per cui la stored va in errore se si tenta di applicarla a una vista schemabinding. Mentre nei BOL di SQL2005 e dal messaggio di errore restituito di SQL2005 SP2 il fatto è messo chiaramente in evidenza.

3) mi tocca riscrivere la mia sp_RefreshAllView per SQL 2005 anche perchè adesso ci sono di mezzo gli schema di database:

 

CREATE PROCEDURE RefreshAllView AS
BEGIN
    DECLARE views_cursor CURSOR
    FOR
    SELECT
        '[' + S.name + '.' + O.name + ']' As ViewName
    FROM
        sys.objects O
    INNER JOIN sys.schemas S
    ON O.schema_id = S.schema_id
    WHERE type='V'

    OPEN views_cursor
 
    DECLARE @view nvarchar(256)
 
    FETCH NEXT FROM views_cursor INTO @view
    WHILE @@FETCH_STATUS = 0
    BEGIN
   
        SET @view = N'EXEC SP_REFRESHVIEW ' + @view
   
        BEGIN TRY
            EXEC sp_executesql @view
        END TRY
        BEGIN CATCH
            IF ERROR_NUMBER() = 8197
                PRINT 'Impossibile eseguire' + @view + ' perchè schemabinding'
        END CATCH

        FETCH NEXT FROM views_cursor INTO @view
    END
 
    CLOSE views_cursor
    DEALLOCATE views_cursor

END
GO

Comments

No Comments