是否有最佳实践将数据加载到数据库中,以便与新安装的应用程序一起使用?例如,要运行应用程序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 :(得分:2)
如果不是很多数据,那就是配置数据的初始化 - 我们通常用任何数据库创建/修改来编写脚本。
使用脚本可以控制很多,因此您只能插入缺失的行,删除已知过时的行,不覆盖已定制的某些列等。
如果它是大量数据,那么你可能想要一个外部文件 - 我会避免使用电子表格,而是使用纯文本文件(BULK INSERT)。您可以将其加载到暂存区域,并仍然使用您可能在脚本中使用的技术,以确保您不会破坏目标中的任何特殊自定义。因为它受脚本控制,所以您可以控制操作顺序以确保参照完整性。
答案 1 :(得分:2)
我建议结合Cade的答案所指出的两种方法。
步骤1.将所有需要的数据加载到临时表中(例如,在Sybase上,将表“db1..table1”的数据加载到“temp..db1_table1”中)。为了能够处理大型数据集,请使用批量复制机制(无论您的数据库服务器支持哪种),而无需写入事务日志。
步骤2.运行一个脚本,作为主要步骤将迭代每个要加载的表,如果需要,在新创建的临时表上创建索引,将临时表中的数据与主表进行比较,并插入/更新/删除差异。然后根据需要,脚本可以执行辅助任务,例如您提到的安全角色设置。