按照与约束的关系顺序部署数据库表
本文关键字:顺序 部署 数据库 关系 约束 | 更新日期: 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字段到版本控制表(或创建一个表,特别是依赖项),并检查是否存在一个查询是或否