¿Por qué se recomienda a las personas que no actualicen a través de vistas?

8

Durante la universidad, nos golpearon en la cabeza no actualizar las tablas a través de las vistas, y nuevamente cuando llegué al lugar de trabajo, nos dijeron que no actualizáramos la base de datos a través de las vistas.

¿Dónde hay / hay implicaciones significativas de rendimiento para hacer esto? ¿O es más un caso de desarrolladores senior / DBA que le dicen al personal junior que no haga esto porque pueden causar estragos involuntariamente con una unión incorrecta?

EDITAR
Estoy usando MSSQL 2000-2008 (Dependiendo de los detalles del cliente)

Tim Sparg
fuente
¿Qué DBMS estás usando?
a_horse_with_no_name
@a_horse_with_no_name Actualizado para indicar DBMS. Esperaba que la respuesta fuera bastante genérica en todos los DBMS '. ¿Estaba siendo ingenuo?
Tim Sparg
¿Estás hablando de vistas que son naturalmente actualizables o vistas para las que tendrías que escribir un INSTEAD OFdisparador? No he escuchado este consejo, en particular, ¿por qué nunca se le dio una razón?
Martin Smith
@TimSparg: depende de cómo se actualiza la vista. Si instead ofse usan disparadores, entonces no hay ambigüedad y no veo una razón para no usarlos. Pero no estoy tan familiarizado con SQL Server, por lo que no puedo comentar sobre el uso de vistas sin un disparador.
a_horse_with_no_name
@ Martin Smith, estoy hablando de vistas naturalmente actualizables. Me dijeron vagamente que hay dificultades y problemas de rendimiento, esto se reforzó en mi lugar de trabajo donde nos dijeron firmemente que no actualizáramos a través de las vistas. Estoy empezando a pensar que era algo que dirían los desarrolladores / DBA senior porque no tenían ganas de explicar que debían tener cuidado al actualizar a través de las vistas (combinación interna o externa de IE)
Tim Sparg

Respuestas:

10

Para que una vista sea actualizable sin usar INSTEAD OFactivadores "SQL Server debe poder rastrear sin ambigüedades las modificaciones desde la definición de la vista a una tabla base". .

No hay ninguna desventaja de rendimiento al actualizar estas vistas, ya que SQL Server solo generará un plan de consulta para la tabla base afectada. Una posible desventaja podría ser que agrega una capa de ofuscación, por lo que a menos que esté utilizando Vistas como capa de seguridad, es más claro escribir código que actualice la tabla base directamente.

Otro podría ser si la Vista contiene uno a muchos JOINy actualiza el lado "uno" con un valor del lado "muchos". No es determinante el resultado que obtiene, pero lo mismo se aplica a la UPDATE ... FROMsintaxis patentada de SQL Server . Debería usar MERGEuna subconsulta correlacionada escalar para evitar este posible problema.

Para las vistas que no son actualizables y requieren un INSTEAD OFdesencadenante, hay implicaciones de rendimiento ya que las insertedy deletedpseudo tablas deben generarse a partir de la tabla base, por lo que si es posible, actualizar las tablas base directamente probablemente será más eficiente.

Martin Smith
fuente