Actualizando columnas identity en SQL Server

Aclaremos algunos conceptos primero, la propiedad identity puede ser utilizada para generar automáticamente valores clave en una columna, con esto quiere decir que una columna identity no tiene que ser necesariamente una clave primaria, y una clave primaria no tiene que llevar necesariamente la propiedad identity.

Una columna identity no puede ser modificada (Cannot update identity column), la opción identity_insert sólo permite insertar valores en este tipo de columnas, pero nunca actualizarlos. ¿cómo actualizarlos entonces?


Pongámonos en el peor de los casos, una clave primaria de tipo identity a la que hacen referencia foreign keys de otras tablas, si necesitásemos actualizar los valores deberíamos seguir el siguiente procedimiento:
  1. identificar todas las foreign keys que apuntan a la columna identity que deseamos modificar (esto lo podemos hacer con el SSMS escribiendo el nombre de la tabla, seleccionándolo y pulsando Alt + F1, o lo que es lo mismo ejecutando el procedimiento almacenado sp_help)
  2. crear y ejecutar un script para modificar todas esas foreign key de manera que al actualizar la columna de referencia se actualicen las columnas de destino ON UPDATE CASCADE
  3. desde el SSMS quitarle la propiedad identity a la columna
  4. cambiar los valores como una consulta UPDATE normal
  5. habilitar nuevamente la propiedad identity en la columna (automáticamente pondrá el valor de la semilla en 1 más que el máximo valor que hayamos insertado)
  6. modificar las foreign keys si tenían otro valor ON UPDATE
De esta forma podríamos actualizar columnas identity sin perder las referencias en otras tablas.

Recomiendo comprobar luego objetos que tengan SCHEMABINDING que utilicen esta tabla porque el SSMS generalmente suele quitarles esta propiedad sin volverla a poner.

Comentarios