Esempio n. 1
0
        /// <summary>
        /// Возвращает сущуствующий столбец таблицы.
        /// </summary>
        /// <param name="tableInfo">Сущуствующая таблица.</param>
        /// <returns></returns>
        private DBColumnInfo GetExistingColumn(DBTableInfo tableInfo)
        {
            if (tableInfo == null)
            {
                throw new ArgumentNullException("tableInfo");
            }

            DBColumnInfo existingColumn = null;

            //если столбец является инкрементом, получаем существующий столбец с инкрементом таблицы
            if (this.IsIdentity && tableInfo.IdentityColumn != null)
            {
                existingColumn = tableInfo.IdentityColumn;
            }
            //в ином случаем получаем столбец по названию.
            else
            {
                existingColumn = tableInfo.GetColumn(this.Name);
            }

            return(existingColumn);
        }
Esempio n. 2
0
        /// <summary>
        /// Возвращает существующий триггер существующей таблицы, соответвующий схеме триггера.
        /// </summary>
        /// <param name="existingTable">Существующая таблица.</param>
        /// <returns></returns>
        private DBTriggerInfo GetExistingTrigger(DBTableInfo existingTable)
        {
            if (existingTable == null)
            {
                throw new ArgumentNullException("existingTable");
            }

            //получаем триггер по имени
            DBTriggerInfo existingTrigger = existingTable.GetTrigger(this.Name);

            //если триггер по полному имени не получили, пытаемся найти триггер относительному имени.
            if (existingTrigger == null)
            {
                foreach (DBTriggerInfo triggerInfo in existingTable.Triggers)
                {
                    if (triggerInfo.NameLow.EndsWith("_" + this.Schema.RelativeNameLow))
                    {
                        existingTrigger = triggerInfo;
                        break;
                    }
                }
            }
            return(existingTrigger);
        }
Esempio n. 3
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);
        }
Esempio n. 4
0
 /// <summary>
 /// Возвращает существующий индекс существующей таблицы, соответвующий схеме индекса.
 /// </summary>
 /// <param name="existingTable">Существующая таблица.</param>
 /// <returns></returns>
 protected abstract DBIndexInfo GetExistingIndex(DBTableInfo existingTable);