Modificar datos mediante una vista

Puede modificar los datos de una tabla base subyacente a través de una vista, de la misma forma que se modifican los datos de una tabla mediante las instrucciones UPDATE, INSERT y DELETE, o mediante la utilidad bcp y la instrucción BULK INSERT. No obstante, las siguientes restricciones se aplican a la actualización de vistas, pero no a las tablas:

[!NOTA]

Algunas de las siguientes restricciones no se aplican a vistas con particiones y ninguna de las restricciones se aplica a actualizaciones que se lleven a cabo por medio de desencadenadores INSTEAD OF. Para obtener más información, vea "Otras opciones para modificar datos mediante una vista" más adelante en este tema.

  • Cualquier modificación, incluidas las instrucciones UPDATE, INSERT y DELETE, debe hacer referencia a las columnas de una única tabla base.

  • Las columnas que se vayan a modificar en la vista deben hacer referencia directa a los datos subyacentes de las columnas de la tabla. No se pueden obtener de ninguna otra forma, como las siguientes:

    • Una función de agregado (AVG, COUNT, SUM, MIN, MAX, GROUPING, STDEV, STDEVP, VAR y VARP).

    • Un cálculo; la columna no se puede calcular a partir de una expresión que utilice otras columnas. Las columnas formadas con operadores de conjunto (UNION, UNION ALL, CROSSJOIN, EXCEPT e INTERSECT) equivalen a un cálculo y tampoco se pueden actualizar.

  • Las columnas que se modifican no pueden verse afectadas por cláusulas GROUP BY, HAVING ni DISTINCT.

  • No se puede usar TOP en ninguna parte de select_statement de la vista cuando se especifica también WITH CHECK OPTION.

Las restricciones anteriores se aplican a cualquier subconsulta de la cláusula FROM de la vista, al igual que a la propia vista. Por lo general, SQL Server 2008 debe poder realizar claramente el seguimiento de modificaciones desde la definición de vista a una tabla base. Por ejemplo, la siguiente vista no se puede actualizar:

CREATE VIEW TotalSalesContacts
AS
SELECT C.LastName, 
SUM(O.TotalDue) AS TotalSales
FROM Sales.SalesOrderHeader O, Person.Contact C
WHERE C.ContactID = O.ContactID
GROUP BY LastName

Una modificación efectuada en la columna LastName de TotalSalesContacts no sería aceptable porque la columna se ha visto afectada por una cláusula GROUP BY. Si existe más de una instancia de un mismo apellido, SQL Server no sabría cuál actualizar, insertar o eliminar. Asimismo, cualquier otro intento de modificar la columna TotalSales de TotalSalesContacts devolvería un error, porque es una columna derivada de una función de agregado. SQL Server no puede hacer el seguimiento de esta columna directamente hasta su tabla base, SalesOrderHeader.

Se aplican las siguientes directrices adicionales:

  • Todas las instrucciones de modificación de datos que se ejecuten en la vista deben cumplir los criterios especificados en la instrucción SELECT que la definen, en caso de utilizar la cláusula WITH CHECK OPTION en su definición. Si se utiliza esta cláusula, no es posible modificar las filas de forma que desaparezcan de la vista. Cualquier modificación que provoque esto se anula y aparece un error.

  • Las instrucciones INSERT deben especificar valores para las columnas de la tabla subyacente que no permiten valores NULL y no tienen definiciones DEFAULT.

  • Los datos modificados en las columnas de la tabla subyacente se ajustan a las condiciones que afectan a esas columnas, como la nulabilidad, las restricciones, las definiciones DEFAULT, etc. Por ejemplo, si se elimina una fila, todas las restricciones FOREIGN KEY subyacentes de las tablas relacionadas deben cumplirse para que pueda llevarse a cabo la eliminación.

  • Una vista con particiones distribuidas (vista remota) no se puede actualizar mediante un cursor dinámico. Esta restricción se puede resolver declarando el cursor en las tablas subyacentes, y no en la propia vista.

  • La importación masiva de datos a una vista con particiones no es compatible con la utilidad bcp ni con las instrucciones BULK INSERT e INSERT ... SELECT * FROM OPENROWSET(BULK...). Sin embargo, puede insertar varias filas en una vista con particiones utilizando la instrucción INSERT. Para obtener más información, vea Exportar o importar datos de forma masiva en una vista.

  • En una vista no se pueden utilizar las instrucciones READTEXT y WRITETEXT con columnas text, ntext o image.

Otras opciones para modificar datos mediante una vista

Si las restricciones descritas en este tema le impiden modificar datos directamente mediante una vista, considere las siguientes opciones:

  • Utilice desencadenadores INSTEAD OF con lógica para admitir instrucciones INSERT, UPDATE y DELETE. Para obtener más información, vea Diseñar desencadenadores INSTEAD OF.

  • Utilice vistas divididas actualizables que modifiquen una o más tablas miembro. Para obtener más información, vea Crear vistas con particiones.

Para agregar datos mediante una vista

Para cambiar datos mediante una vista

Para eliminar datos mediante una vista

Vea también

Conceptos