Desencadenadores INSTEAD OF UPDATE
Se pueden definir desencadenadores INSTEAD OF UPDATE en una vista o tabla para reemplazar la acción estándar de la instrucción UPDATE. Normalmente, el desencadenador INSTEAD OF UPDATE se define en una vista para modificar datos en una o más tablas base.
Las instrucciones UPDATE que hacen referencia a vistas que contienen desencadenadores INSTEAD OF UPDATE deben suministrar valores para todas las columnas que no admiten valores NULL a las que hace referencia la cláusula SET. Esto incluye columnas de vistas que hacen referencia a columnas de la tabla base para las que no se pueden especificar valores de entrada, como:
Columnas calculadas de la tabla base.
Columnas de identidad de la tabla base en las que el valor de IDENTITY INSERT está establecido en OFF.
Columnas de la tabla base con el tipo de datos timestamp.
Con frecuencia, cuando una instrucción UPDATE que hace referencia a una tabla intenta establecer el valor de una columna calculada, de identidad o de tipo timestamp, se genera un error, ya que SQL Server debe determinar los valores de estas columnas. Hay que incluir estas columnas en la instrucción UPDATE para satisfacer el requisito NOT NULL de la columna. Sin embargo, si la instrucción UPDATE hace referencia a una vista con un desencadenador INSTEAD OF UPDATE, la lógica definida en el desencadenador puede pasar por alto estas columnas y evitar el error. Para ello, el desencadenador INSTEAD OF UPDATE no debe intentar actualizar los valores de las columnas correspondientes en la tabla base. A fin de conseguir esto, no deben incluirse las columnas en la cláusula SET de la instrucción UPDATE. Cuando se procesa un registro de la tabla inserted, la columna calculada, de identidad o de tipo timestamp puede contener un valor ficticio para satisfacer el requisito de columna NOT NULL, pero el desencadenador INSTEAD OF UPDATE ignora estos valores y SQL Server establece los valores correctos.
Esta solución funciona porque un desencadenador INSTEAD OF UPDATE no tiene que procesar datos de las columnas inserted no actualizadas. En la tabla inserted pasada al desencadenador INSTEAD OF UPDATE, las columnas especificadas en la cláusula SET siguen las mismas reglas que las columnas inserted de un desencadenador INSTEAD OF INSERT. Para las columnas no especificadas en la cláusula SET, la tabla inserted contiene los mismos valores que tenía antes de emitir la instrucción UPDATE. El desencadenador puede comprobar si una columna específica se ha actualizado mediante la cláusula IF UPDATED(column). Para obtener más información, vea Desencadenadores INSTEAD OF INSERT.
Los desencadenadores INSTEAD OF UPDATE sólo deben utilizar los valores suministrados por las columnas calculadas, de identidad o timestamp, en condiciones de búsqueda de la cláusula WHERE.
La lógica que debe utilizar un desencadenador INSTEAD OF UPDATE de una vista para procesar los valores actualizados que suministran las columnas calculadas, de identidad, timestamp o predeterminadas, es la misma que la que se aplica a los valores insertados para estos tipos de columnas.
[!NOTA]
No se puede definir desencadenadores INSTEAD OF UPDATE en una tabla que tenga una clave externa definida mediante una acción UPDATE.