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

本文关键字:顺序 部署 数据库 关系 约束 | 更新日期: 2023-09-27 18:04:53

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

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

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

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

没有硬编码,是否有一种方法来识别和排序表脚本运行基于他们的依赖关系?例:将来可能会有数百个表。

如果这些信息还不够,请告诉我。

谢谢吧!

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

您可以编写一个小算法来根据约束对表进行排序,但这并不总是可能的(假设您有一个循环引用)。更好的方法是先创建所有的表,然后添加约束(一旦所有的表都创建了)。

我更喜欢傻瓜的方式。我在数据库中添加了一个"ScriptVersion"表,并跟踪已应用的更新脚本"版本"。在我的更新脚本中,我检查数据库是否存在,以及它的"版本"。如果版本号不正确,则打印错误消息。以下是我的一个更新脚本的摘录:

if db_id('[DATABASENAME]') is null

开始print('数据库不存在:请运行创建脚本')结束其他的开始使用(数据库名)

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字段到版本控制表(或创建一个表,特别是依赖项),并检查是否存在一个查询是或否