[Windows Azure] Tables without a clustered index are not supported in this version of SQL Server – Entity Framework Migration

Como muchos desarrolladores, no soy experto en ningún motor de base de datos. Conozco muchas de las cosas que como desarrollador debería conocer con motores con los que he trabajado, y pese a que se qué éste es un tema controversial, soy de los que piensa que el desarrollador no debería “casarse” con un tipo o producto/fabricante de almacenamiento de datos en especifico, esto prefiero dejárselo a los expertos DBAs y acudir o incluir uno en el equipo cuando sea necesario (casi siempre), y por el contrario saber moverse muy bien entre distintos tipos y motores de bases de datos  sin llegar a ser un experto. Esto lo digo porqué creo que pasarían muchos años para conseguirlo y en la época que la que vivimos hablar de años ya es mucho tiempo para la tecnología.

En este caso me pasó algo curioso con el SQL Azure y una migración del Entity Framework, que, como cosa rara, en mi maquina funcionaba :(. El caso es sencillo: Cambiar el tipo de dato de una columna que es clave primaria. No preguntes porqué ha surgido esta necesidad, pero así fue.

En mi SQL Server 2012 bastó con un código de la forma:

            DropPrimaryKey("dbo.MyTable");
            AlterColumn("dbo.MyTale", "Id", c => c.Long(nullable: false));
            AddPrimaryKey("dbo.MyTable", "Id");

Y con esto se habrá generado bien un Index Clustered para MyTable.

Cuando pasamos al Azure y corrimos una YSOD nos avisó de este error:

ErrorSQL

Y aquí fue donde me enteré de algo nuevo sobre SQL Azure! que sin ser un experto debía saber, pues en la documentación inicial del producto lo dice: “Windows Azure SQL Database does not support tables without clustered indexes” entonces la instrucción DropPrimaryKey se vuelve invalida y mi migración ya no sirve aquí :(.

La solución es un poco más engorrosa ahora, hay que crear una nueva tabla con la estructura deseada, copiar los datos a esta, borrar la tabla inicial y renombrar la nueva tabla con el nombre correcto, esto en un script de SQL y ejecutarlo con el método SQL(string). Algo de la forma:

            const string sql = @"
EXECUTE sp_rename N'[PK_dbo.MyTable]', N'[PK_dbo.MyTale_old]',  'OBJECT'
CREATE TABLE [dbo].[Temp_MyTable](
 [Id] [bigint] NOT NULL, 
 [Foo] [nvarchar](max) NULL,
 CONSTRAINT [PK_dbo.MyTable] PRIMARY KEY CLUSTERED 
(
 [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)
INSERT INTO dbo.[Temp_MyTable] (Id, [Foo])
SELECT [Id]
      ,[Foo]
  FROM [dbo].[MyTable]

drop table dbo.[MyTable]

EXECUTE sp_rename N'Temp_MyTable', N'MyTable', 'OBJECT'";

            Sql(sql);

Esto por supuesto que no salió de mi conocimiento, aquí  y aquí algo documentación de la comunidad 🙂

Espero sea de utilidad.

Hasta el próximo post.

Anuncios
[Windows Azure] Tables without a clustered index are not supported in this version of SQL Server – Entity Framework Migration

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s