Развертывание таблиц базы данных в порядке взаимосвязи с ограничениями

1

Надеюсь, я правильно объясню этот вопрос.

Мой проект ASP.NET содержит список сценариев таблицы базы данных MS SQL Server для будущих обновлений и т.д. Я могу просто запустить сценарий снова, не добавляя новые файлы. В настоящее время для каждой таблицы базы данных:

---CREATING TABLE---
    IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[DATABASETABLENAME]') AND type IN (N'U'))
    //CREATE TABLE CODE HERE

---BUILDING RELATIONSHIPS---
    IF NOT EXISTS (SELECT [name] FROM sysobjects WHERE [name] = 'FK_CONSTRAINTNAME') ALTER TABLE [dbo].[DATBASETABLENAME] DROP CONSTRAINT [FK_CONSTRAINTNAME]
    //ADD CONSTRAINT CODE HERE

Моя проблема в том, что если таблица, с которой выполняется ограничение, еще не выполнила свой скрипт, таблица не существует и не будет выполнена.

Я мог бы проверить, существует ли другая таблица ограничений, но для работы все равно потребуется запустить все скрипты.

Без hardcoding существует ли способ идентифицировать и упорядочивать скрипты таблицы, основанные на их зависимостях? например, в будущем могут быть сотни таблиц.

Пожалуйста, дайте мне знать, если этой информации недостаточно.

Спасибо, вперед!

Теги:
sql-server

2 ответа

1

Вы можете написать небольшой алгоритм для упорядочивания таблиц на основе ограничений, но это не всегда возможно (представьте, что у вас есть круговая ссылка). Лучше всего было бы сначала создать все таблицы, а затем добавить ограничения (после создания всех таблиц).

  • 0
    Спасибо, я просто подожду немного, чтобы увидеть, что говорят другие люди. Я надеялся, что мне не придется отделять ограничения от моих табличных сценариев. Но я понимаю проблему циркулярной ссылки, которой у меня нет в настоящее время, но, несомненно, скоро она будет.
  • 0
    если у вас нет циклических ссылок, это похоже на сортировку массива, где вместо «t1 <t2» вы говорите «t1 зависит от t2»
Показать ещё 1 комментарий
0

То, что я предпочитаю, является дурацким способом. Я добавляю таблицу "ScriptVersion" в свою базу данных, и я отслеживаю версию "версия" для обновления, которая была применена. В моих сценариях обновления я проверяю, существует ли база данных и в какой версии она находится. Если номер версии неправильный, я печатаю сообщение об ошибке. Ниже приведен пример одного из моих сценариев обновления:

if db_id('[DATABASENAME]') is null

begin print ('База данных не существует: запустите скрипт create.') end else begin use [DATABASENAME]

if object_id('ScriptVersion', 'U') is null
begin
    print('Database does not contain a Script version table. Please check the upgrade script.')
end
else
begin
    -- check the latest upgrade
    if ((select max(ToVersion) from ScriptVersion) <> 4)
    begin
        print('Invalid upgrade. Check which upgrade to run.');
    end
    else
    begin
        -- START update statements

        exec('alter table Activities add Comments varchar(256)')
        exec('alter table Activities add IsCancelled bit not null default(0)')

        -- END update statements


        -- Insert new script version (update from version #4 to version #5)
        exec('insert into ScriptVersion(Description, FromVersion, ToVersion) values (''Upgrade 5.'', 4, 5)')
    end
end

конец

В вашей конкретной ситуации я мог бы добавить поле "DependencyName" или DependencyId и IsDependency в таблицу версий (или создать таблицу специально для зависимостей) и проверить, существует ли данная зависимость с запросом "да" или "нет".

  • 0
    Спасибо за это. Это не очень помогает мне в этом случае, хотя. Спасибо :)
  • 0
    Я буду использовать его в ближайшее время. Спасибо @SeanTech

Ещё вопросы

Сообщество Overcoder
Наверх
Меню