Abbiamo creato due schema, uno chiamato SchemaSource ed uno chiamato SchemaDestination.
A questo punto, creiamo una vista sotto lo SchemaSource:
CREATE VIEW SchemaSource.View_1 AS SELECT 1 AS Val, 'A' AS String;
Lo script seguente, aggiorna i metadati della vista indicata sopra:
EXEC sp_refreshview 'SchemaSource.View_1'
Nessun problema, il comando è eseguito correttamente. Ma proviamo a fare una transfer della view dallo SchemaSource allo SchemaDestination:
ALTER SCHEMA SchemaDestination TRANSFER SchemaSource.View_1;
GO
Proviamo ora a fare refresh dei metadati della vista "spostata":
EXEC sp_refreshview 'SchemaDestination.View_1'
Ecco il messaggio che riceverete:
Msg 208, Level 16, State 6, Procedure sp_refreshsqlmodule_internal, Line 75
Invalid object name 'SchemaSource.View_1'.
Sembra che nella sp_refreshsqlmodule_internal vi siano problemi di gestione dell'oggetto. E' come se la vista fosse ancora collegata allo schema di partenza.
Un
ticket aperto a MS ci chiarisce un po' il problema..
Come si nota, il problema c'è anche se si prova a rinominare una vista tramite designer o
sp_rename.
In SQL Server 2008 questo errore è risolvibile facendo un'ALTER della vista:
ALTER VIEW SchemaDestination.View_1 AS SELECT 1 AS Val, 'A' AS String;
GO
Dopo questa operazione, la refresh funziona senza problemi.
In SQL Server 2012, il problema è definitivamente fixato.