|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Nouveau Membre du Club
![]() Inscription : octobre 2004 Messages : 61 ![]() |
Bonjour à tous,
J'ai besoin d'une clarification sur la mise à jour des vues(j'utilise SQL Server 2000). Créons une table et sa vue associée : Code :
Ceci provoque l'erreur : Serveur*: Msg 4406, Niveau 16, État 1, Ligne 1 Impossible de mettre à jour ou d'insérer une vue ou une fonction 'V_INT' car elles contiennent un champ d'une dérivée ou d'une constante. Par contre la mise à jour fonctionne ?? : Code :
Merci d'avance |
||||
|
|
00
|
|
|
#2 |
|
Futur Membre du Club
![]() Consultant informatique Inscription : juin 2011 Messages : 18 ![]() |
C'est normal...
les vue comme son nom l'indique sert de "vue" donc c'est seulement une table de visualisations et tu peux pas faire de traitement dessus. Donc quand t'essaye de la modifier c'est normal que sql server te gronde dessus. Si tu dois faire des modif c'est sur la table principale (T_INT dans ton cas) |
|
|
01
|
|
|
#3 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Non,
il est possible d’insérer, et mettre à jour une vue, lorsque celle-ci est triviale. Il faut simplement que le moteur soit en mesure de "retrouver ses petits". Lorsque la vue est plus complexe, il faut alors créer des triggers instead of insert/update... D'ailleurs ici, à mon sens, l'insertion, comme la mise à jour devraient passer ! |
|
|
00
|
|
|
#4 |
|
Futur Membre du Club
![]() Consultant informatique Inscription : juin 2011 Messages : 18 ![]() |
Autant pour moi .
Oui effectivement on peut faire des traitement sur des vues, sauf que la vue ne connais pas forcement toutes les colonnes, et n'as pas forcement toute les contraintes d'integrites de la table "mére". Sur des vue basique ça peut marcher, par contre je n'en vois pas l'interet? (autant faire les modifs sur la table "mere" ) Cordialement, |
|
|
00
|
|
|
#5 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
L’intérêt peut être de "masquer" un modèle logique complexe pour les applications clientes, qui, avec une simple requête, peuvent alors effectuer des opération plus compliquées...
Cela peut aussi permettre d'autoriser certains utilisateurs à insérer/mettre à jour certaines colonnes d'une table, mais pas toutes ! Enfin (et peut être surtout), cela permet de pouvoir effectuer des modifications sur le modèle de la base sans affecter les applications, qui continueront d'inserer/mettre à jour la vue, sans être perturbée par le changement de structure de la table sous-sous-jacente... Cela dit, après test sur un SQL Server 2008 avec les scripts de billybob2, l'insertion fonctionne, tout comme la mise à jour... Je n'ai pas de SQL 2000 sous la main pour tester... |
|
|
00
|
|
|
#6 | |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Bonjour,
Citation:
Faites donc un trigger INSTEAD OF sur cette vue. Comme l'a dit aieeeuuuuu, tout l'intérêt des vues est là : le modèle externe de données, qui est très rarement utilisé. Les triggers INSTEAD OF sur les vues sont là pour faire les manipulations de données à la place de l'utilisateur. On prend pour habitude de manipuler directement les tables, et pourtant cette démarche est fausse. SQLPro vous en dirait bien plus que moi là-dessus @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|
|
00
|
|
|
#7 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 954 ![]() |
La raison pour laquelle votre vue n'est pas "misajourable" est simple : la fonction inverse (I-1) n'est pas bijective....
Étonnant non ? Et pourtant vrai ! Devinez pourquoi ???? A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#8 |
|
Nouveau Membre du Club
![]() Inscription : octobre 2004 Messages : 61 ![]() |
Si elle n'est pas "miseajourable" pourquoi l'update fonctionne ?
De plus , l'insertion concerne la colonne I qui n'est pas une fonction mais un champs de type integer ... |
|
|
00
|
|
|
#9 | |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Citation:
hmmm, Peut être car -2 147 483 648 n'a pas d'image par la fonction (I-1), et que 2 147 483 647 n'est l'image d'aucune valeur possible de I ??? |
|
|
|
00
|
|
|
#10 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 954 ![]() |
Exact !!!! bravo !!!! Et du fait de la clause WHERE qui restreint les valeurs dans le cas évoqué d'UPDATE, cette non bijection devient fausse !
Cela dit 2005/2008 est plus fin sur le sujet en acceptant l'insert de I ! A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
Copyright © 2000-2012 - www.developpez.com