Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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);
        }