Una vista che utilizza la SELECT * (star) non è in grado di riconoscere una modifica intervenuta nella struttura delle tabelle da cui dipende (sia essa l’aggiunta che la eliminazione di colonna). Questo accade perchè la lista delle colonne viene interpretata solo al momento della CREATE della vista o eventualmente di una successiva ALTER.
Una alternativa alla ALTER è rappresentata dall’uso della stored procedure si sistema SP_REFRESHVIEW [ @viewname = ] ‘viewname’ che aggiorna la struttura della vista in base all’attuale struttura delle tabelle e viste di base. Da notare che se lanciata su una vista creata con l’opzione WITH SCHEMABINDING, la suddetta sp_refreshview restituisce un errore.
Per lanciare la sp_refreshview su tutte le viste di un database, si può ricorrere alla seguente user-defined stored procedures (valida per SQL Server 2005).
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