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

MS SQL Server Discussion :

SQL SERVER 2000 - Vue dangereuse


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 112
    Par défaut SQL SERVER 2000 - Vue dangereuse
    Bonjour tout le monde,

    je travaille sur un MS SQL 2000, et je viens de decouvrir un phénomène aussi interessant que dangereux!
    Je suis certain que d'autres ont eu le meme problème mais moi je n'aurais jamais imaginé un truc pareil.

    le probleme est le suivant:
    - on a une TABLE qui ressemble à ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Col_A   Col_B   Col_C   Col_D
    A1      B1      C1      D1
    A2      B2      C2      D2
    ...     ...     ...     ...
    et on en fait une VUE qui ressemble a ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Col_A   Col_B   Col_C
    A1      B1      C1      
    A2      B2      C2
    -Si je decide de changer l'ordre des colonnes dans TABLE, au lieu de:
    Col_A
    Col_B
    Col_C
    Col_D
    on a l'ordre suivant:
    Col_A
    Col_B
    Col_D
    Col_C

    TABLE aura l'air comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Col_A   Col_B   Col_D   Col_C
    A1      B1      D1      C1
    A2      B2      D2      C2
    ...     ...     ...     ...
    mais VUE ressemblera à ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Col_A   Col_B   Col_C
    A1      B1      D1      
    A2      B2      D2      
    !?!?!?!?!
    bien entendu le meme probleme peut etre generé si on supprime des colonnes de TABLE...
    Pour que la vue prenne la nouvelle structure, il faut qu'elle soit reexecuté et sauvgardé... ce que moi personnelement je fais qu'une fois lors de la creation de la vue, oubien s'il faut modifier quelque chose dans la vue...

    Donc utiliser des vues pour des processus automatisé risque d'etre dangereux...

    Est ce que ce truc est deja connu chez vous les professionnels de SQL Server?
    Est ce que c'est juste dans SQL 2000 que ceci peut se produire?

    Merci de partager ce que vous en pensez!

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Par défaut
    bonjour,

    C'est bien le fonctionnement normal. Vous avez la possibilité de créer vos vues avec l'option SCHEMABINDING qui empêchera toute modif sur les tables sous-jacentes d'une vue (il faudra alors la dropper puis la recréer).

    Sinon, pour prendre en compte les modifs de structure dans une table sous-jacente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sp_refreshview <nom de la vue>

  3. #3
    Membre Expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 797
    Par défaut
    Un truc m'échappe:

    Si ta table Clients est composée des champs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Numéro Client     Nom    Prénom    Adresse
    et ta vue

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT [Numéro Client], Nom, [Prénom], Adresse FROM Clients

    Je ne comprends pas du tout pourquoi si tu changes l'ordre des champs dans la table (quoique là aussi je ne comprends pas le but de la manoeuvre vu que "l'ordre" n'a pas de sens dans un schéma d'une db), cet "ordre" impacterait ta vue.

    Ton SELECT fait référence au nom des champs; pas à leur position. La valeur du champs Adresse restera une adresse.

    Y'à vraiment un truc que j'ai pas pigé.

  4. #4
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 112
    Par défaut
    Citation Envoyé par kagemaru Voir le message
    ...C'est bien le fonctionnement normal...
    Merci kagemaru.
    si c'est le fonctionnement normal des vues, ca m'a couté quelques jours pour
    comprendre la source de quelques problemes tres serieux surevenu à cause de ca...

    Voici le cas reel:

    j'ai une table Participant qui doit permettre l'existance de doublons...
    ces doublons ont malheureusement des ID differents(numero de participant)
    concretement: un participant peut avoir 2 comptes avec 2 ID mais un des deux comptes a le status Actif, l'autre est Passiv.
    Il existe dans ma table Participant une autre colonne ID_Europeen qui a la meme valeurs chez le participant (Actif et Passiv).

    Là j'utilise 2 vues:
    -Vue_Actif:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select * from Participant where Actif=1
    -Vue_Passiv:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select * from Participant where Actif=0
    Plus loin dans mon programme je fais la joiture suivante pour trouver les participant double pour pouvoir transferer tout ce qui a été enregistré du compte Passiv au compte Actif:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select * from 
    Vue_Actif inner join Vue_Passiv
    on Vue_Actif.ID_Europeen=Vue_Passiv.ID_Europeen
    le malheur est arrivé quand la structure de la table Participant a été modifié. du coup la colonne ID_Europeen dans mes vues pointe vers une autre colonne qui par hasard est une date d'enregistrement...
    et voila que la jointure me retourne des combinaison avec la date au lieu du ID_Europeen ce qui me donne des participants tout à fait differents des doubles que je cherche...
    vous imaginer le reste... des commandes ont été transferé à des Participant qui n'ont jamais rien commandé, au lieu de les transferer au nouveau compte des Participant (qui ont 2 comptes Actif/Passiv)


    J'espere que cette explication est claire pour toi cavo789...

    Si seulement je savais que ceci se passe comme ca, j'aurais fait en sorte de rafraichir mes vues chaque fois que je les appele

    ...

    Pour ceux qui vont me conseiller de travailler avec des ID unique pour les participants... ca peut pas marcher pour des raisons politiques

    Merci!

  5. #5
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Bonjour !
    Je suis aussi perplexe que Cavo.

    Normalement, une vue est définie par : (par exemple)
    CREATE VIEW mavue
    AS
    SELECT COL1 as C1, COL2 as C2, COL4 as C4
    FROM tableref

    Donc, si la COL3 disparait, où si l'ordre des colonnes de tableref change, ça ne change rien, non ?
    Jusque là, je pensais qu'une vue simple était simplement un alias sur une requête réinterprétée à chaque appel.

    Peux-tu donner le script de création de ta vue ?

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 112
    Par défaut
    Salut,

    la vue est crée comme dit plus haut:
    select * from participant where actif=1


    Je ne defini pas de colonnes specifiques car la vue est utilisé dans plusieurs endroit, pour plusieur raisons...
    donc pour eviter de taper certaines conditions dans mes requetes, j'utilise une vue qui elle contient deja des conditions...

    Merci!

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 265
    Par défaut
    Le "SELECT *" c'est à bannir des pratiques de développement... c'est ce qu'on essaye de te dire, référence explicitement les champs dans ta vue et cela t'évitera de mauvaises surprises.

Discussions similaires

  1. Réponses: 9
    Dernier message: 20/03/2007, 19h56
  2. [Sql Server 2000] Création de vue complexe
    Par sofien dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/12/2006, 10h10
  3. Requête sur Vue SQL Server 2000 PLANTE aléatoirement
    Par StarMusic dans le forum Bases de données
    Réponses: 1
    Dernier message: 07/11/2006, 10h22
  4. Minus,intersect,union et vue avec sql server 2000
    Par donny dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 22/02/2006, 07h46
  5. [SQL Server 2000] ajouter une colonne identité dans une vue?
    Par CetTer dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 02/08/2005, 13h43

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