El SSMS (SQL Server Management Studio) de 2008 tiene varios cambios con respecto a sus versiones anteriores, a mi en lo general la mayoría me han gustado y mucho.
Uno de esos cambios es una prevención de cambios en estructuras de nuestras tablas, muchas veces cuando utilizamos esta herramienta y hacemos cambios no nos damos cuenta por debajo de ese cambio que es realmente lo que sucede, hay algunas cosas que son simples y otras un poco mas complejas, por ejemplo si quiero agregar un nuevo campo y lo hago al final de los actuales eso a nivel TSQL se resuelve con un simple ALTER TABLE, ahora bien, si ese campo en lugar de querer agregarlo ultimo lo quiero hacer en medio de otro existente no quedara otro remedio a nivel TSQL que borrar la tabla, crearla nuevamente y pasar los datos, esto no seria problema si estamos en un ambiente de desarrollo o con pocos registros, pero que sucedería si estamos en un ambiente productivo o con muchos registros? pues podríamos colapsar al sistema ya que la operación demoraría un tiempo.
Para ser mas explícitos con esto aquí abajo copio dos códigos, ambos son la salida de agregar un campo desde el SSMS a una tabla, el primero es como ultimo campo y el segundo ejemplo en el medio de algún campo actual para que podamos comparar las diferencias y que cosas tiene que hacer SQL para lograr nuestro cometido.
Ejemplo 1
BEGIN TRANSACTION
GO
ALTER TABLE dbo.EMPLEADOS ADD
CUIT nchar(10) NULL
GO
ALTER TABLE dbo.EMPLEADOS SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
Ejemplo 2
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_EMPLEADOS
(
LEGAJO int NOT NULL,
NOMBRE varchar(30) NULL,
CUIT nchar(10) NULL,
FECHA datetime NULL,
EDAD int NULL
) ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_EMPLEADOS SET (LOCK_ESCALATION = TABLE)
GO
IF EXISTS(SELECT * FROM dbo.EMPLEADOS)
EXEC('INSERT INTO dbo.Tmp_EMPLEADOS (LEGAJO, NOMBRE, FECHA, EDAD)
SELECT LEGAJO, NOMBRE, FECHA, EDAD FROM dbo.EMPLEADOS WITH (HOLDLOCK TABLOCKX)')
GO
DROP TABLE dbo.EMPLEADOS
GO
EXECUTE sp_rename N'dbo.Tmp_EMPLEADOS', N'EMPLEADOS', 'OBJECT'
GO
ALTER TABLE dbo.EMPLEADOS ADD CONSTRAINT
PK__EMPLEADO__5487D90715702A09 PRIMARY KEY CLUSTERED
(
LEGAJO
) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
ALTER TABLE dbo.EMPLEADOS ADD CONSTRAINT
CK__EMPLEADOS__EDAD__1758727B CHECK (([EDAD]>=(18) AND [EDAD]<=(70)))
GO
COMMIT
Como se podrá observar el segundo ejemplo puede llegar a causarnos bastantes problemas. Bien esto sucede porque el cambio que le solicitamos no tiene otra opción que hacerlo así, en otras palabras nosotros desde el SSMS podemos hacer las cosas de forma visual (de eso se trata la idea de usar parte de esta herramienta) pero todo se traduce a sentencias TSQL.
Ahora bien, en versiones anteriores al producto una persona podía hacer el segundo cambio sin mediar el impacto porque desconoce el mismo y la herramienta no lo previene.
Ahora y con la versión 2008 por defecto hay un seteo en las opciones que nos permite prevenir cualquier cambio vía interfaz que represente el borrado de una tabla (como en nuestro ejemplo 2), esa opción se muestra en la siguiente figura y se llama Prevent saving changes that requiere table re-reation
Al estar esta opción activada cuando hacemos un cambio que representa una regeneración de la tabla nos encontraremos con el siguiente mensaje de error: Saving Changes is not permitted