/// <summary> /// Возвращает существующий кластеризованный индекс существующей таблицы, соответвующий схеме индекса. /// </summary> /// <param name="existingTable">Существующая таблица.</param> /// <returns></returns> protected override DBIndexInfo GetExistingIndex(DBTableInfo existingTable) { if (existingTable == null) { throw new ArgumentNullException("existingTable"); } //получаем кластеризованный индекс по имени. DBIndexInfo existingIndex = existingTable.GetIndex(this.Name); //обрабатываем ошибку изменения существующих индексов SharePoint-таблиц, //у которых состав столбцов совпадает с состовом столбцов индексов, определенных в SPXObjects. if (!this.Schema.SchemaAdapter.IsPermanentSchema) { //если индекс по имени не получили, пытаемся найти индекс по признаку первичного ключа - такой индекс в таблице может быть только один. if (existingIndex == null) { existingIndex = existingTable.PrimaryKey; } } //если для кластеризованного индекса получили обычный, ругаемся. if (existingIndex != null && !existingIndex.IsPrimaryKey) { throw new Exception(string.Format("Существующий индекс [{0}] таблицы {1} должен быть кластеризованным индексом.", this.Name, existingTable.Name)); } return(existingIndex); }
/// <summary> /// Возвращает существующий некластеризованный индекс существующей таблицы, соответвующий схеме индекса. /// </summary> /// <param name="existingTable">Существующая таблица.</param> /// <returns></returns> protected override DBIndexInfo GetExistingIndex(DBTableInfo existingTable) { if (existingTable == null) { throw new ArgumentNullException("existingTable"); } //получаем некластеризованный индекс по имени. DBIndexInfo existingIndex = existingTable.GetIndex(this.Name); //если индекс по имени не получили, пытаемся найти индекс по набору столбцов. if (existingIndex == null) { foreach (DBIndexInfo indexInfo in existingTable.Indexes) { //пропускаем индекс с первичным ключом. if (indexInfo.IsPrimaryKey) { continue; } if (!this.Schema.SchemaAdapter.IsPermanentSchema) { //т.к. индексов с соответствующем набором столбцов может быть несколько то выбираем тот, имя которого оканчивается на DBIndex.RelativeName. //а если такового не имеется, то выбираем первый попавшийся индекс с набором столбцов, соответствующих схеме. if (indexInfo.NameLow.EndsWith("_" + this.Schema.RelativeNameLow)) { existingIndex = indexInfo; break; } else if (this.ColumnsEqual(indexInfo) && existingIndex == null) { if (!this.Table.ContainsIndex(indexInfo.Name)) { existingIndex = indexInfo; } } } else { //обрабатываем ошибку изменения существующих индексов SharePoint-таблиц, //у которых состав столбцов совпадает с состовом столбцов индексов, определенных в SPXObjects. if (indexInfo.NameLow.StartsWith(("IX_" + this.Table.Prefix).ToLower()) || indexInfo.NameLow.StartsWith(("IX_" + this.Table.OriginalPrefix).ToLower()) || indexInfo.NameLow.StartsWith(("Ind_" + this.Table.Prefix).ToLower()) || indexInfo.NameLow.StartsWith(("Ind_" + this.Table.OriginalPrefix).ToLower())) { if (this.ColumnsEqual(indexInfo) && existingIndex == null) { if (!this.Table.ContainsIndex(indexInfo.Name)) { existingIndex = indexInfo; } } } } } } //если для обычного индекса получили кластеризованный, ругаемся. if (existingIndex != null && existingIndex.IsPrimaryKey) { throw new Exception(string.Format("Существующий индекс [{0}] таблицы {1} должен быть некластеризованным индексом.", this.Name, existingTable.Name)); } return(existingIndex); }