pourquoi est-il conseillé aux gens de ne pas mettre à jour les vues

8

Pendant le Collège, il nous a été frappé de ne pas mettre à jour les tables via des vues, et encore une fois quand je suis entré dans le lieu de travail, on nous a dit de ne pas mettre à jour la base de données via les vues.

Où y a-t-il / Y a-t-il des implications importantes en termes de performances? Ou s'agit-il davantage d'un cas où des développeurs / administrateurs de bases de données seniors disent au personnel subalterne de ne pas le faire, car ils peuvent faire des ravages sans le savoir avec une jointure incorrecte.

EDIT
J'utilise MSSQL 2000-2008 (selon les particularités du client)

Tim Sparg
la source
Quel SGBD utilisez-vous?
a_horse_with_no_name
@a_horse_with_no_name Mis à jour pour indiquer le SGBD. J'espérais que la réponse serait assez générique dans tous les SGBD ». Étais-je naïf?
Tim Sparg
Parlez-vous de vues qui peuvent être mises à jour naturellement ou de vues pour lesquelles vous auriez à écrire un INSTEAD OFdéclencheur? Je n'ai pas entendu ce conseil en particulier BTW vous n'a-t-on jamais donné de raison?
Martin Smith
@TimSparg: cela dépend de la façon dont la vue peut être mise à jour. Si des instead ofdéclencheurs sont utilisés, il n'y a pas d'ambiguïté et je ne vois aucune raison de ne pas les utiliser. Mais je ne connais pas très bien SQL Server, je ne peux donc pas commenter l'utilisation des vues sans déclencheur.
a_horse_with_no_name
@Martin Smith Je parle de vues naturellement actualisables. On m'a vaguement dit qu'il y avait des pièges et des problèmes de performance, cela a ensuite été renforcé sur mon lieu de travail où nous étions fermement invités à ne pas mettre à jour les vues. Je commence à penser que c'était juste quelque chose que les développeurs principaux / administrateurs de base de données diraient parce qu'ils n'avaient pas envie d'expliquer de faire attention à la mise à jour via les vues (IE interne vs jointure externe)
Tim Sparg

Réponses:

10

Pour qu'une vue puisse être mise à jour sans utiliser de INSTEAD OFdéclencheurs, "SQL Server doit pouvoir tracer sans ambiguïté les modifications de la définition de la vue vers une table de base". .

La mise à jour de ces vues ne présente aucun inconvénient en termes de performances, car SQL Server génère simplement un plan de requête pour la table de base affectée. Un inconvénient possible pourrait être qu'il ajoute une couche d'obscurcissement, donc à moins que vous n'utilisiez Views comme couche de sécurité, il est plus clair d'écrire simplement du code qui met à jour la table de base directement.

Un autre peut être si la vue contient un à plusieurs JOINet que vous mettez à jour le côté "un" avec une valeur du côté "plusieurs", le résultat final n'est pas déterministe, mais il en va de même pour la UPDATE ... FROMsyntaxe propriétaire de SQL Server . Vous devez utiliser MERGEou une sous-requête scalaire corrélée pour éviter ce problème possible.

Pour les vues qui ne peuvent pas être mises à jour et nécessitent un INSTEAD OFdéclencheur, il y a des implications en termes de performances car les insertedet deletedpseudo-tables doivent être générées à partir de la table de base, donc si possible, la mise à jour directe des tables de base sera probablement plus efficace.

Martin Smith
la source