IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Vue vide suite à la mise à jour du schéma [2012]


Sujet :

Développement SQL Server

  1. #1
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 760
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut Vue vide suite à la mise à jour du schéma
    Bonsoir,

    Sur une application que je gère depuis maintenant près de 4 ans, il m'arrive un petit bug de temps en temps, et je ne sais absolument pas d'où cela peut venir. Du coup, je demande l'avis d'experts

    Voici le problème : parfois, après la mise à jour du schéma de ma base, certaines vues ne retourne plus aucune valeur. Un SELECT * sur la vue ne me retourne plus aucun enregistrement, sans message d'erreur. Cela se produit parfois si je modifie une table utilisée par ma vue (mais pas tout le temps).

    Si je vais dans SQL Management Studio, que je fais un clic-droit sur ma vue et que je génère un script ALTER VIEW et que je l'exécute (sans modification donc), alors tout rentre dans l'ordre.

    D'où peut venir le problème ? Serait-ce un problème lié au cache des plans d'exécution (et le ALTER VIEW viendrait nettoyer le cache) ? Mais si c'est le cas, SQL Server ne devrait-il pas vide le cache automatiquement si une des tables utilisées par la vue change ?

    Merci d'avance pour vos éclairages
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Les changements de schéma doivent altérer les vues, ou alors la définition des vues est changée avant le schéma.
    Il vous faut ajouter un EXEC sp_refreshview sur les vues impactées une fois toutes les instructions DDL exécutées.

    @++

  3. #3
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 760
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Merci pour les infos. Mais si le SGBD ne fait pas cela automatiquement, c'est qu'il doit y avoir une raison. Et Microsoft a bien dû réfléchir au problème, sinon, il n'y aurait pas cette procédure à exécuter afin de mettre à jour les vues. Mais j'avoue ne pas avoir d'idée concernant le pourquoi.

    Serait-ce pour éviter de mettre à jour les vues à chaque instruction DDL, et de permettre ainsi de ne mettre à jour les vues qu'une seule fois une fois l'ensemble des instructions DDL ait été exécuté ?
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  4. #4
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Que se passe-t-il si tu les bind au schéma ?

    Attention cependant : même si en soit c'est "mieux", ça implique quelques limitations, notamment quand on modifie les tables sur lesquelles se basent les vues :
    http://stackoverflow.com/questions/1...-in-sql-server
    On ne jouit bien que de ce qu’on partage.

  5. #5
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 760
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    J'avoue ne pas avoir testé dans cette configuration. Dans la mesure où l'application évolue sans cesse (c'est une application dans le domaine médical, et entre les nouveaux besoins utilisateurs, l'évolution du cadre légal, etc...) je suis obligé de mettre régulièrement à jour le schéma de ma base (au moins une fois par mois). En règle général, ce ne sont pas des grosses modifs (dans 90% des cas, se sont simplement des colonnes à rajouter ou de nouvelles tables), mais il arrive qu'il y ait des chamboulements plus ou moins important.

    Je préfère faire un ALTER VIEW quand le soucis se pose (ou essayer un EXEC sp_refreshview) que de m'enquiquiner avec le schema binding qui serait plus lourd en terme de maintenance sans véritable gain pour l'application, dans la mesure où je n'utilise pas de vues indexées, que la base de données est propre à l'application et que je suis le seul développeur à modifier la base. (il faudrait que je supprime l'ensemble de mes vues avant de pouvoir intervenir sur mes tables pour ensuite recréer mes vues).

    Ma question initiale c'était juste pour essayer de comprendre ce qui se passe exactement, car autant je peux comprendre qu'une vue soit "cassée" si par exemple, on supprime une colonne d'une table référencée par la vue, autant je suis surpris que l'ajout d'une colonne puisse "invalider" la vue sans erreur, si ce n'est qu'un SELECT * sur la vue ne revoit plus aucun enregistrement.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par dorinf Voir le message
    Ma question initiale c'était juste pour essayer de comprendre ce qui se passe exactement, car autant je peux comprendre qu'une vue soit "cassée" si par exemple, on supprime une colonne d'une table référencée par la vue, autant je suis surpris que l'ajout d'une colonne puisse "invalider" la vue sans erreur, si ce n'est qu'un SELECT * sur la vue ne revoit plus aucun enregistrement.
    C'est parfaitement normal, justement parce que vous utilisez un SELECT * !
    C'est d'ailleurs stupide d'utiliser le SELECT * en général et plus en particulier sur une vue...

    En effet avec un SELECT * le moteur doit impérativement retrouver toutes les colonnes et donc va taper dans les tables de méta données pour construire le plan de requête qui est mis en cache. Si l'une quelconque des tables est modifiée et quelque soit cette modif, alors le plan est invalidé...
    La solution consiste...
    1) a éviter le SELECT *
    2) a utiliser un sp_refreshview sur l'ensemble des vues après passage d'ordre DDL

    Pour le point 2, vous pouvez utiliser le script suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DECLARE @SQL NVARCHAR(max) = N'';
    SELECT @SQL = @SQL + N'EXEC sp_refreshview ''' + TABLE_SCHEMA + N'.' + TABLE_NAME + N''';'
    FROM INFORMATION_SCHEMA.VIEWS;
    EXEC (@SQL);
    Et pour de plus amples informations :
    Nom : Couverture livre SQL server Eyrolles.jpg
Affichages : 127
Taille : 105,0 Ko
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 760
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    C'est parfaitement normal, justement parce que vous utilisez un SELECT * !
    C'est d'ailleurs stupide d'utiliser le SELECT * en général et plus en particulier sur une vue...
    Alors pour que les choses soient claires (car il est vrai que je ne l'avais pas précisé) : quand je faisais le SELECT *, c'était avec Management Studio afin de faire des tests pour essayer de comprendre ce qui se passe. J'évite d'utiliser les SELECT * dans mes programmes. Je ne l'utilise que lorsque je fais des requêtes ponctuelles pour un traitement à la mano.

    Citation Envoyé par SQLpro Voir le message
    En effet avec un SELECT * le moteur doit impérativement retrouver toutes les colonnes et donc va taper dans les tables de méta données pour construire le plan de requête qui est mis en cache. Si l'une quelconque des tables est modifiée et quelque soit cette modif, alors le plan est invalidé...
    La solution consiste...
    1) a éviter le SELECT *
    2) a utiliser un sp_refreshview sur l'ensemble des vues après passage d'ordre DDL
    Et c'est là où je viens de me faire avoir. Car même si j'évite le SELECT * dans mes programmes, les 2 vues qui me posent problèmes à chaque fois... l'utilise ! Alors qu'en plus cela n'est même pas nécessaire... (sachant que les deux vues sont proches et l'une est issu d'un copier/coller de l'autre). Bref, je devais être fatigué ce jour là, faire une requête à la va-vite pour tester un truc et ensuite faire un copier/coller pour la transformer en vue. Mais au moins, maintenant, je sais quoi faire pour éviter le soucis à l'avenir. Merci

    Citation Envoyé par SQLpro Voir le message
    Et pour de plus amples informations :
    Nom : Couverture livre SQL server Eyrolles.jpg
Affichages : 127
Taille : 105,0 Ko
    Il est déjà commandé. Depuis samedi ! Avec de la chance, il arrive demain !!!!
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Oracle] Catchable fatal error: (suite à une mise à jour en PHP 5.2)
    Par nyto-86 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 05/06/2008, 11h53
  2. petite question suite à une mise à jour
    Par pitou_christophe dans le forum Bubuntu
    Réponses: 1
    Dernier message: 30/05/2008, 21h22
  3. Mise à jour du schéma
    Par chezjm dans le forum JPA
    Réponses: 1
    Dernier message: 09/04/2008, 13h23
  4. inclusion échouant suite à une mise à jour
    Par moliere007 dans le forum Langage
    Réponses: 3
    Dernier message: 15/01/2008, 10h13
  5. Vue multi table et mise à jour
    Par neptune dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/10/2007, 16h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo