viernes, 23 de marzo de 2012

No es posible añadir columnas a una tabla con SQL Server Management Studio 2008 R2

Por alguna razón que desconozco no he podido añadir una nueva columna a una de las tablas de la base de datos alojada en un SQL Server 2008 R2 desde el Management Studio. El mensaje de error es el siguiente:

SQL01SSMS

Por lo que veo Management Studio para añadir una columna lo que hace es eliminar la tabla y volverla a crear. Algo totalmente innecesario ya que SQL Server está preparado para añadir columnas a las tablas. Así que he probado a añadir la columna con Transact-SQL y tal como esperaba no he tenido ningún tipo de problema:

ALTER TABLE dbo.E_PLANTILLA_PREG ADD
    FACTOR nvarchar(3) NOT NULL
GO


Lo curioso del tema es que si le pido al SSMS el SQL que va a utilizar para añadir la columna me devuelve algo parecido a esto (la sintaxis la he podido conseguir añadiendo una columna que permita valores nulos, en caso contrario recibía error del aplicativo indicando que no podía proceder a realizar los cambios sin eliminar la tabla en cuestión):

BEGIN TRANSACTION
GO
ALTER TABLE dbo.E_PLANTILLA_PREG ADD
    NUEVA_COL nchar(10) NULL
GO
ALTER TABLE dbo.E_PLANTILLA_PREG SET (LOCK_ESCALATION = TABLE)
GO
COMMIT


Curioso que para añadir una columna que permite nulos se utiliza un ALTER TABLE y sin embargo para añadir una columna que no permite nulos se intente eliminar la tabla. Supongo que lo hará para asegurar las consistencia de los datos existentes en la tabla ya que para los registros existentes no se le podría dar valor a la columna que queremos añadir.

Y como es difícil quedarse con la duda, quiero probar si realmente es esto último lo que provoca este comportamiento. Para comprobarlo añado una columna que no permite nulos configurando un valor por defecto para ese nuevo campo. Y efectivamente, la columna se crea desde el SSMS sin problemas.

BEGIN TRANSACTION
GO
ALTER TABLE dbo.E_PLANTILLA_PREG ADD
    NUEVA_COL nchar(10) NOT NULL CONSTRAINT DF_E_PLANTILLA_PREG_NUEVA_COL DEFAULT N'A'
GO
ALTER TABLE dbo.E_PLANTILLA_PREG SET (LOCK_ESCALATION = TABLE)
GO
COMMIT


Uno se va tranquilo a la cama pensando que todo tiene su razón de ser. =)

No hay comentarios:

Publicar un comentario