代码之家  ›  专栏  ›  技术社区  ›  YWE

如何在SQLServer中使用SMO删除和重新创建和主键索引?

  •  7
  • YWE  · 技术社区  · 14 年前

    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();
        }
    }
    

    但是当我尝试创建索引时,我得到了一个异常消息“cannotaccessproperties或methodsforthe”Microsoft.SqlServer.Management.Smo索引“[PK_table1]”,因为它已被删除。“那么有没有一个好的方法来完成我想用SMO做的事情呢?

    6 回复  |  直到 14 年前
        1
  •  5
  •   8kb    14 年前

    // using System.Collections.Specialized;
    
    foreach (Table table in database.Tables)
    {
        // object to hold the index script
        StringCollection pk_script = new StringCollection();
    
        Index pk = table.Indexes.Cast<Index>().SingleOrDefault(index => index.IndexKeyType == IndexKeyType.DriPrimaryKey);
        if (pk != null)
        {
            // script the index
            pk_script = pk.Script();
            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();
    
        // iterate through script StringCollection
        foreach (String tsql in pk_script)
        {
            database.ExecuteNonQuery(tsql);
        }                
    } 
    

    1. 定义pk的行将抛出 如果有表,则为异常 无索引
    2. 删除主键将失败 如果表被绑定到架构的视图引用
    3. 删除主键将失败 如果表被引用 外键约束
    4. 更改列的数据类型 如果该列用于
    5. 删除群集主键 移除所需的时间 聚集索引将建议 进程失败了(实际上, 它仍在运行)
        2
  •  4
  •   IsmailS    14 年前

    请按以下方式再次尝试创建主键。

    Index index = new Index(table, "PK_tableNameTable");
    index.IndexKeyType = IndexKeyType.DriPrimaryKey;
    
    //You will have to store the names of columns before deleting the key.
    index.IndexedColumns.Add(new IndexedColumn(index,"ID")); 
    
    table.Indexes.Add(index);
    

    Source of the snippet

        3
  •  0
  •   blorkfish    14 年前

    索引对象可能丢失了对表的引用。

    table.Indexes.Add(pk);
    
        4
  •  0
  •   ktharsis    14 年前

    与其删除并重新创建索引,不如尝试禁用它,然后在使用完成后重新启用它 .Disable .Enable 方法。

        5
  •  0
  •   ZXX    14 年前

        6
  •  0
  •   W. Kevin Hazzard    13 年前