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 :

comment sql server laisse passer un update dont le from ne contient pas la table ? [2008R2]


Sujet :

MS SQL Server

  1. #1
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut comment sql server laisse passer un update dont le from ne contient pas la table ?
    Bonjour,


    (sql 2008R2 et sql 2005 exécute la requête aussi)

    Aujourd'hui avec une erreur d'écriture on a réussi à écrire ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE A SET C5 = valeurInt1
        FROM B
        WHERE B.C1 = ValeurInt2 AND C3 = 8
    C3 appartenant à la table A

    on a oublié la jointure entre A et B
    toute la table A a été updatée (C3 étant bien sur la table A, la dernière condition a été prise en compte et ca a fait moins de dégâts que ce que ca aurait pu faire)

    mais la question qu'on se pose c'est pourquoi SQL server laisse passer ca
    moi ca me parrait illogique de laisser passer un update d'une table qui ne figure pas dans le from

    si quelqu'un sait le pourquoi je veux bien le connaitre ..

    Merci.

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 699
    Points : 586
    Points
    586
    Par défaut
    T'es pas obliger d'avoir un from pour un UPDATE

    le code suivante fonctionne parfaitement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     UPDATE A SET A.Libelle='Blabla' WHERE A.ID = 215
    Dans ton cas N'ayant pas de jointure, tout les record de A sont valide dans la selection et donc ils sont tous concerné par l'update

  3. #3
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    Citation Envoyé par Donpi Voir le message
    T'es pas obliger d'avoir un from pour un UPDATE
    certes

    Citation Envoyé par Donpi Voir le message
    N'ayant pas de jointure, tout les record de A sont valide dans la selection et donc ils sont tous concerné par l'update
    certes aussi, mais bon sql server voit bien que j'ai mis un from
    et quand il y a au moins 2 tables dans le from il attend qu'on précise avant le from sur quelle table on veut agir


    si éventuellement on peut me trouver un cas utile où dans le from on met une autre table que pour l'update ca me suffira à accepter ce comportement

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    La clause de jointure peut être faite dans le WHERE, les 2 syntaxes ci-dessous sont équivalentes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    update t1 set c = c2
      from t1
      join t2 on t2.id2 = t1.id;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    update t1 set c = c2
      from t2
     where t2.id2 = t1.id;
    Dans la doc il n'est fait aucune mention sur la nécessité de préciser la table à mettre à jour dans le FROM :
    http://msdn.microsoft.com/fr-fr/library/ms177523.aspx
    FROM <table_source>

    Specifies that a table, view, or derived table source is used to provide the criteria for the update operation.

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    La clause de jointure peut être faite dans le WHERE
    oui mais la clause dans le where c'est moins lisible et ca ne suit pas la norme

    Citation Envoyé par skuatamad Voir le message
    Dans la doc il n'est fait aucune mention sur la nécessité de préciser la table à mettre à jour dans le FROM :
    http://msdn.microsoft.com/fr-fr/library/ms177523.aspx
    la nécessité est faite avant le from
    enfin c'est surtout pour le delete que ca change la syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    delete from table
     
    delete table obligatoirement spécifiée from table inner join autretable
    enfin ma question n'est pas comment écrire un update, je cherche plus à comprendre ce choix de microsoft qui me parrait étrange dans mon cas mais peut etre justifié dans d'autres ...

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 699
    Points : 586
    Points
    586
    Par défaut
    Très sérieusement, il faut être claire!

    Vous avez fait une bourde et vous avez aucune chance de mettre la faute sur SQL Server sans une grand dose de mauvaise fois.

    Faut assumer et apprendre de ses erreurs.

    A+

  7. #7
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    Citation Envoyé par Donpi Voir le message
    Très sérieusement, il faut être claire!

    Vous avez fait une bourde et vous avez aucune chance de mettre la faute sur SQL Server sans une grand dose de mauvaise fois.

    Faut assumer et apprendre de ses erreurs.

    A+
    lol

    où avez vous vu que je cherche à mettre la faute sur ms ? en plus je dis au début qu'on a fait un oubli en l'écrivant
    et puis si c'était important on serait revenu en arrière via le log complet ou autre

    vous ne pouvez pas concevoir qu'on veuille comprendre un choix sur l'outil qu'on utilise ?

    ma question n'est peut etre pas à la portée de tout le monde mais je pense qu'elle est claire :
    "comment sql server laisse passer un update dont le from ne contient pas la table ?"
    le "tout les record de A sont valide dans la selection" répond en partie à la question mais ne justifie pas le choix ...

  8. #8
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    oui mais la clause dans le where c'est moins lisible et ca ne suit pas la norme
    C'est pourtant ce qu'on fait avec EXISTS, je vois plus ça comme un UPDATE corrélé.
    Citation Envoyé par Pol63 Voir le message
    je cherche plus à comprendre ce choix de microsoft qui me parrait étrange dans mon cas mais peut etre justifié dans d'autres ...
    Moi je ne connais pas bien le monde sqlserver, mais c'est peut être juste lié à de la rétro-compatibilité (en remontant jusqu'à l'époque sybase avant la syntaxe SQL92).

  9. #9
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 100
    Points : 31 538
    Points
    31 538
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    ca me paraît illogique de laisser passer un update d'une table qui ne figure pas dans le from
    Vous avez raison d'avoir des doutes, car laisser passer l'UPDATE tel quel rend l'opération non déterministe et la doc MS SQL Server met en garde :

    "Soyez vigilant lors de la spécification de la clause FROM pour fournir les valeurs destinées à servir de critères en vue de la mise à jour. Les résultats d'une instruction UPDATE ne sont pas définis si celle-ci comprend une clause FROM qui ne spécifie pas qu'une seule valeur doit être disponible pour chaque occurrence de colonne mise à jour ; à savoir, si l'instruction UPDATE n'est pas déterministe."

    L’opération n’étant pas déterministe, c'est de la dynamite et il y a donc des précautions à prendre sinon ça vous pète en pleine figure.

    Voyez par exemple ici et .

  10. #10
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    mais la question qu'on se pose c'est pourquoi SQL server laisse passer ca
    moi ca me parrait illogique de laisser passer un update d'une table qui ne figure pas dans le from

    si quelqu'un sait le pourquoi je veux bien le connaitre ..

    Merci.
    Ca poserait des problèmes de compatibilité avec l'UPDATE sans aucune jointure (et en plus, bien sûr, de rétro-compatibilité).

    Il faut tout simplement considérer que le FROM inclue en plus la table utilisée pour l'UPDATE (d'ailleurs vous pouvez bien mettre une condition sur C3). Ce qui manque, c'est la condition de jointure entre les deux tables, et ça SQL Server n'a aucune raison de supposer que vous souhaitez vraiment une telle condition.

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

Discussions similaires

  1. [SQL SERVER 2008] Passer une variable à un requete.
    Par lerieure dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 19/01/2011, 22h24
  2. [SQL Server 2K5] Ecriture d'UPDATE
    Par achestyx dans le forum Développement
    Réponses: 2
    Dernier message: 23/07/2009, 11h46
  3. [sql Server 2000] Pb D'update
    Par dondiavolo1983 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 13/04/2007, 08h08
  4. Réponses: 9
    Dernier message: 20/09/2006, 15h58
  5. Réponses: 2
    Dernier message: 16/05/2006, 10h52

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