按照与约束的关系顺序部署数据库表

时间:2014-05-25 00:37:53

标签: c# asp.net sql sql-server

我希望我能正确解释这个问题。

我的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

我的问题是,如果正在制作约束的表尚未运行其脚本,则该表不存在并且将失败。

我可以检查其他约束表是否存在,但仍然需要运行所有脚本两次才能工作。

如果没有硬编码,是否有办法根据其依赖性识别和排序运行的表脚本?例如,将来可能有数百张表。

如果此信息不充分,请与我们联系。

提前致谢!

2 个答案:

答案 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字段添加到版本控制表中(或者创建一个特别针对依赖项的表)并检查给定的依赖项是否存在查询是或否。