Надеюсь, я правильно объясню этот вопрос.
Мой проект 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 существует ли способ идентифицировать и упорядочивать скрипты таблицы, основанные на их зависимостях? например, в будущем могут быть сотни таблиц.
Пожалуйста, дайте мне знать, если этой информации недостаточно.
Спасибо, вперед!
Вы можете написать небольшой алгоритм для упорядочивания таблиц на основе ограничений, но это не всегда возможно (представьте, что у вас есть круговая ссылка). Лучше всего было бы сначала создать все таблицы, а затем добавить ограничения (после создания всех таблиц).
То, что я предпочитаю, является дурацким способом. Я добавляю таблицу "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 в таблицу версий (или создать таблицу специально для зависимостей) и проверить, существует ли данная зависимость с запросом "да" или "нет".