Las vistas siempre han sido utilizadas como una forma cómoda de escribir consultas, ya que ocultan la complejidad de un SELECT y la exponen como una tabla virtual; sin embargo, en SQL Server es posible actualizar los datos de las tablas a través de las vistas llamadas vistas actualizables.
Dichas vistas son, como cualquier vista, una forma simplificada de ver los datos de una o más tablas reales, por medio de una «tabla virtual», sin embargo, en SQL Server es posible actualizar los datos de las tablas actualizándolos por medio, o a través, de alguna vista.
Requisitos para poder hacer una vista actualizable
- La vista debe hacerse referencia a una sola tabla.
- La definición de la vista no debe tener campos calculados o funciones de agregación.
- No debe tener GROUP BY, HAVING, DISTINCT.
- No se debe, por medio de la actualización de la vista, incumplir alguna restricción de la tabla origen.
- Si es vista de vistas, todas deben ser actualizables.
- La vista debe contener la llave principal (a menos que se genere automáticamente como en una llave que es IDENTITY)
Ejemplo de vista actualizable
Partiendo de la siguiente tabla y vistas
--Creación de tablas y vistas para probar las vistas actualizables CREATE TABLE alumnos ( id int IDENTITY PRIMARY KEY, nombre varchar(50), direccion varchar(50) DEFAULT 'Desconocido', edad int NOT NULL CHECK (edad > 0), estatus char(1) DEFAULT 'A' ); GO CREATE VIEW v_alumnos1 AS SELECT * FROM alumnos; GO CREATE VIEW v_alumnos2 AS SELECT nombre, edad FROM alumnos; GO CREATE VIEW v_alumnos3 AS SELECT id, nombre, estatus FROM alumnos; GO CREATE VIEW v_alumnos4 AS SELECT id, nombre AS nombreCompleto, edad, 500 AS cuotaInscripcion FROM alumnos; GO
En este caso, intentaremos actualizar la tabla origen, pero por medio de algunas de las vistas
Vista actualizable con todos los campos de la tabla original
En este caso un INSERT o un UPDATE es igual que con la tabla original, no hay cambio y se puede utilizar de manera indistinta la tabla original (alumnos) o la vista con todos los campos (v_alumno1).
Vista actualizable con solo algunos campos de la tabla original (sin la llave primaria)
Para poder actualizar una tabla por medio de una vista que no contenga todos los campos de la tabla original, es indispensable que los campos que quedaron fuera de la vista acepte nulos, tengan valores por default, o tengan algún mecanismo para «llenarse» al momento de hacer un INSERT a la vista, ya que esa vista no podrá dar valores a los campos faltantes en la vista.
Es el caso del ejemplo anterior, ya que tanto id, direccion y estatus (que no están en la definición de la vista) pueden tomar valores por default o, en el caso del id, es un campo IDENTITY.
Actualización de tabla por medio de vista actualizable, intentando incumplir alguna restricción de la tabla original
En el caso de la siguiente imagen, la vista no contiene todos los campos, quedando fuera de la vista el campo edad que no permite nulos y que tiene una restricción tipo CHECK. En este caso, cuando se quiere hacer un INSERT sobre la vista se obtiene el mensaje de error, indicando que no se puede asignar un valor NULL al campo edad, ya que incumpliría con la definición de la tabla original. Sin embargo, el UPDATE es posible, siempre y cuando los cambios no se contrapongan con alguna restricción de la tabla original.
Actualización con vista que tiene campos calculados o funciones de agregación
En este caso, la actualización es imposible. Simplemente se rechaza la operación al hacer el análisis regresando un error precisamente indicando que tiene un campo derivado o una constante.