2009-08-13 7 views
11

Je fais beaucoup de développement ces derniers jours, et comme nous travaillons avec des scripts de bases de données centrales, j'écris simplement des mises à jour SQL. scripts, et les exécuter dans la base de données. Eh bien et tout, mais pourquoi ne pas écrire des scripts 'rafraîchir la vue', et les exécuter chaque fois que j'ajoute ou modifie des champs à une vue. SQL Server comprend qu'il doit actualiser la vue lors de son édition dans les fenêtres d'affichage fantaisie-édition de Management Studio, alors pourquoi ne peut-il pas dire à son affichage de se rafraîchir après avoir modifié la vue via un script?Pourquoi les vues SQL Server doivent-elles être rafraîchies de temps à autre?

Répondre

9

Les vues doivent être actualisées si les tables sous-jacentes changent du tout. Cela peut changer les types de données des colonnes de la vue ou réorganiser ses index. Par conséquent, il doit savoir. Dans le cas contraire, vous lanceriez une requête à son encontre, et cela exploserait assez rapidement.

Vous ne devez pas exécuter sp_refreshview pour modifier une vue. Seulement pour modifier ses tables sous-jacentes.

Aussi, s'il vous plaît ne pas plaisanter joyeuse balle amusante. Éditer: Courez simplement ce code (en succession) pour tenter de reproduire votre problème. J'étais, malheureusement, incapable, comme cela a fonctionné comme prévu (SQL Server 2008):

create view MyView 
as 
select ProductKey, ProductID, ProductName, Price 
from dbo.Products 

select v.* from MyView v 

alter view MyView 
as 
select ProductKey, ProductID, ProductName, Price*100 as MyPrice 
from dbo. Products 

select v.* from MyView v 
+1

Mais ce problème se produit également lorsque j'ai quelque chose comme SELECT b. * FROM b. Après avoir ajouté des colonnes à b, la vue tente d'afficher les anciennes colonnes, même si elles ne sont pas codées en dur. –

+0

Les commentaires d'Eric sont toujours valables. Les métadonnées de la vue doivent être actualisées chaque fois que le schéma des tables sous-jacentes est modifié, même si le code de la vue reste correct. – TimothyAWiseman

3

Utilisation WITH SCHEMABINDING dans la définition de la vue d'éliminer le besoin de rafraîchissement

Et en combinaison avec ALTER VIEW, pas le concepteur

Édition, juillet 2012, d'un lien ci-dessus. Mon gras

SCHEMABINDING

Lié la vue au schéma de la table sous-jacente ou des tables. Lorsque SCHEMABINDING est spécifié, la table de base ou les tables ne peuvent pas être modifiées d'une manière qui affecterait la définition de vue. La définition de vue elle-même doit d'abord être modifiée ou supprimée pour supprimer les dépendances sur la table à modifier. Lorsque vous utilisez SCHEMABINDING, select_statement doit inclure les noms en deux parties (schema.object) des tables, des vues ou des fonctions définies par l'utilisateur qui sont référencées. Tous les objets référencés doivent être dans la même base de données.

Les vues ou les tables qui participent à une vue créée avec la clause SCHEMABINDING ne peuvent pas être supprimées sauf si cette vue est supprimée ou modifiée de sorte qu'elle n'a plus de liaison de schéma. Sinon, le moteur de base de données génère une erreur. En outre, l'exécution des instructions ALTER TABLE sur les tables qui participent aux vues qui ont une liaison de schéma échoue lorsque ces instructions affectent la définition de la vue.

+3

J'ai hésité à le suggérer. 'WITH SCHEMABINDING' * only * fonctionne si les tables sont toutes dans la même base de données sur le même serveur. – Eric

+1

L'utilisation de schemabinding supprime le besoin d'actualisations car elle empêche la modification des tables sous-jacentes.Le mieux que cela puisse faire si vous devez modifier les tables sous-jacentes est de vous rappeler que vous devez mettre à jour la vue après avoir supprimé le avec schemabinding pour effectuer la modification. – TimothyAWiseman

+1

Je ne vois pas comment empêcher le changement équivaut à supprimer le besoin de rafraîchissements? Sauf erreur de ma part, WITH SCHEMABINDING empêchera les tables sous-jacentes d'être modifiées? – ErikE

Questions connexes