Tengo curiosidad por saber si es posible crear una tabla con una columna que nunca se pueda cambiar, pero las otras columnas de la tabla sí.
Por ejemplo, podría imaginar una CreatedByUser
columna que nunca debería cambiarse.
¿Existe una funcionalidad incorporada en SQL Server para esto, o solo es posible a través de disparadores u otra cosa?
sql-server
Philipp M
fuente
fuente
Respuestas:
No hay soporte declarativo integrado para columnas no actualizables (excepto para casos predefinidos específicos como
IDENTITY
)Este elemento de Connect lo solicitó pero fue rechazado. Agregue DRI para aplicar valores de columna inmutables
Un
UPDATE
disparador probablemente sería la forma más sólida de lograr esto. Podría verificarIF UPDATE(CreatedByUser)
y generar un error y revertir la transacción si es verdadero.fuente
He implementado el
UPDATE TRIGGER
enfoque sugerido por la respuesta de Martin Smith de la siguiente manera:(Nota: La tabla tiene una columna de Clave primaria, llamada ID).
Solo estoy rechazando la actualización si el valor de AssetTypeID cambia. Entonces, la columna podría estar presente en una actualización, y si el valor no cambiara, entonces pasaría. (Lo necesitaba de esta manera)
fuente
AssetTypeID
se establece en un valor no nulo y se ejecuta,UPDATE Asset SET AssetTypeID = NULL WHERE Asset = the_id
no habrá reversión porqueWHERE i.AssetTypeID <> d.AssetTypeID
en el desencadenador se evaluaría como falso, dejando esa columna editable.Puede usar una vista con columna derivada. Prueba esto
fuente
¿Por qué estás actualizando la columna createdby?
Tendría dos columnas una columna [created_by] y una [modified_by], donde la primera inserción insertaría todas las columnas respectivas en el registro, y cualquier actualización posterior solo actualizaría la columna [modified_by] (a través de un activador en la aplicación capa puede estructurar su actualización para cambiar solo el [modificado_por], junto con sus respectivas columnas)
fuente