Database 预加载数据的好方法是什么?

Database 预加载数据的好方法是什么?,database,web-applications,new-operator,loading,Database,Web Applications,New Operator,Loading,是否有将数据加载到数据库的最佳实践,以便与新安装的应用程序一起使用?例如,要运行应用程序foo,它甚至需要一些基本数据才能启动。我在过去使用过几个选项: 需要预加载的每一行的TSQL: IF NOT EXISTS (SELECT * FROM Master.Site WHERE Name = @SiteName) INSERT INTO [Master].[Site] ([EnterpriseID], [Name], [LastModifiedTime], [LastModifiedUser])

是否有将数据加载到数据库的最佳实践,以便与新安装的应用程序一起使用?例如,要运行应用程序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,我们需要一种维护这种关系的方法

另一个因素是,并非所有数据库都会丢失此数据。一些地点已经拥有大部分数据,而其他(可能是世界各地的新地点)将从头开始


任何想法都值得赞赏。

如果不是大量数据,则是配置数据的简单初始化-我们通常使用任何数据库创建/修改来编写脚本

使用脚本,您可以进行大量控制,因此您可以只插入缺少的行,删除已知已过时的行,而不覆盖已自定义的某些列,等等


如果是大量数据,那么您可能需要一个外部文件-我会避免使用电子表格,而是使用纯文本文件(大容量插入)。您可以将其加载到暂存区域,并且仍然使用脚本中可能使用的技术来确保不会破坏目标中的任何特殊定制。因为它受脚本控制,所以您可以控制操作顺序以确保引用完整性。

我建议结合Cade的回答中指出的两种方法

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


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

看看这个问题是否给您提供了一些更好的想法: