Estoy usando SQL Server 2005 Express. Quiero usar SMO para recorrer cada tabla en una base de datos y cambiar cada columna Char a una columna Varchar. Si una columna es miembro de la clave principal, primero debo soltar la clave primaria antes de alterar el tipo de datos de la columna. Entonces necesito recrear el índice. Aquí está el código que estoy tratando de usar:Cómo descartar y volver a crear y el índice de clave principal utilizando SMO con SQL Server?
foreach (Table table in database.Tables)
{
Index pk = table.Indexes.Cast<Index>().SingleOrDefault(index => index.IndexKeyType == IndexKeyType.DriPrimaryKey);
if (pk != null)
{
pk.Drop();
table.Alter();
}
foreach (Column column in table.Columns.Cast<Column>().Where(column => column.DataType.SqlDataType == SqlDataType.Char))
{
column.DataType = new DataType(SqlDataType.VarChar, column.DataType.MaximumLength);
}
table.Alter();
if (pk != null)
{
pk.Create();
}
}
Pero cuando intento para crear el índice me sale una excepción con el mensaje "No se puede acceder a propiedades y métodos para la Microsoft.SqlServer.Management.Smo.Index ' [PK_table1] ', porque se ha eliminado. " Entonces, ¿hay una buena manera de lograr lo que quiero hacer con SMO?
Intenté hacer una secuencia de comandos del índice antes de descartarlo utilizando el método de secuencia de comandos de Índice, pero arroja una excepción con el mensaje "El índice 'PK_table1' hace referencia a la columna inexistente '[mesa1]. [Propietario]'." La columna del dueño claramente existe.
Si existe una columna y SQL dice que no, me gustaría ver los problemas de seguridad, ¿en qué contexto se ejecutan sus comandos? – Sam
Los comandos se ejecutan bajo el inicio de sesión del administrador del sistema (sa). – YWE
Es más complicado que lo sepas. No puede simplemente dejar caer la clave primaria si se hace referencia a ella en una relación de clave externa. Por lo tanto, para cada PK, deberá encontrar todas las referencias de FK, descartarlas, descartar PK, cambiar el tipo de datos y luego volver a agregarlos en orden inverso. – Thomas