我希望我能正确解释这个问题。
我的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
我的问题是,如果正在制作约束的表尚未运行其脚本,则该表不存在并且将失败。
我可以检查其他约束表是否存在,但仍然需要运行所有脚本两次才能工作。
如果没有硬编码,是否有办法根据其依赖性识别和排序运行的表脚本?例如,将来可能有数百张表。
如果此信息不充分,请与我们联系。
提前致谢!
答案 0 :(得分:1)
您可以编写一个小算法来根据约束对表进行排序,但并不总是可行(假设您有循环引用)。更好的方法是首先创建所有表,然后添加约束(一旦创建了所有表)。
答案 1 :(得分:0)
我更喜欢的是傻瓜式的方式。我添加了一个' ScriptVersion'表到我的数据库,我跟踪更新脚本'版本'已经应用。在我的更新脚本中,我检查数据库是否存在以及版本是什么'它是在。如果版本号不正确,我会打印一条错误消息。以下是我的一个更新脚本的一个部分:
if db_id('[DATABASENAME]') is null
开始 print('数据库不存在:请运行创建脚本。') 结束 其他 开始 使用[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
端 去
在您的特定情况下,我可能会添加一个&#39; DependencyName&#39;或者将DependencyId和IsDependency字段添加到版本控制表中(或者创建一个特别针对依赖项的表)并检查给定的依赖项是否存在查询是或否。