2010-06-11 87 views
2

是否有将数据加载到数据库中的最佳做法,以便与新的应用程序安装一起使用?例如,为了运行foo应用程序,它甚至需要一些基本数据才能启动。我用了几个选项,在过去:什么是预加载数据的好方法?

对于需要每一行

TSQL预加载:

IF NOT EXISTS (SELECT * FROM Master.Site WHERE Name = @SiteName) 
INSERT INTO [Master].[Site] ([EnterpriseID], [Name], [LastModifiedTime], [LastModifiedUser]) 
VALUES (@EnterpriseId, @SiteName, GETDATE(), @LastModifiedUser) 

另一种选择是一个电子表格。每个选项卡都代表一张表格,并且我们意识到我们需要将数据输入到电子表格中。然后,程序可以读取此电子表格并填充数据库。

有复杂的因素,包括表之间的关系。所以,它不像加载表格那样简单。例如,如果我们创建Security.Member行,那么我们想要将这些成员添加到Security.Role中,我们需要一种维护该关系的方法。

另一个因素是不是所有的数据库都会丢失这些数据。一些地点已经拥有大部分的数据,其他地区(可能是全球的新地点)将从头开始。

任何想法表示赞赏。

+0

看看这个SO问题不给你一些更好的想法:http://stackoverflow.com/questions/2503696/database-change-management-setup-for-initial-create-scripts-subsequent-migrati – 2010-06-11 16:15:08

回答

2

如果数据不是很多,那么只需要初始化配置数据 - 我们通常会在创建/修改任何数据库的情况下编写脚本。

使用脚本,你有很多的控制,让您可以插入只缺行,删除这是众所周知的是过时的行,不会覆盖已经自定义的某些列等

如果这是一个很大的数据,那么你可能想要一个外部文件 - 我会避免使用电子表格,而是使用纯文本文件(BULK INSERT)。您可以将其加载到临时区域,并仍然使用您可能在脚本中使用的技术,以确保您不会在目标中打开任何特殊定制。而且,由于它受脚本控制,因此您可以控制操作顺序以确保参照完整性。

2

我推荐了由凯德答案指出的两种方法的组合。

第1步。将所有需要的数据加载到临时表中(例如在Sybase上,将表“db1..table1”的数据加载到“temp..db1_table1”)。为了能够处理大型数据集,请在不写入事务日志的情况下使用大容量复制机制(无论您的数据库服务器支持哪种机制)。

第2步。运行一个脚本,作为主要步骤将遍历每个要加载的表,如果需要在新创建的临时表上创建索引,将临时表中的数据与主表进行比较,并插入/更新/删除差异。然后根据需要,该脚本可以执行辅助性任务,例如您提到的安全角色设置。

相关问题