将表移动到另一个 SQL2008 数据库(包括索引、触发器等)

Bra*_*adC 16 sql-server-2008 sql-server migration

我需要将一大堆(100+)大(数百万行)表从一个 SQL2008 数据库移动到另一个数据库。

我最初只是使用导入/导出向导,但所有目标表都缺少主键和外键、索引、约束、触发器等(身份列也被转换为普通的 INT,但我想我只是错过了向导。)

这样做的正确方法是什么?

如果这只是几个表,我会回到源,编写表定义(包含所有索引等)的脚本,然后在目标上运行脚本的索引创建部分。但是有这么多表,这似乎不切实际。

如果没有太多数据,我可以使用“创建脚本...”向导来编写源代码,包括数据,但是 72m 行脚本似乎不是一个好主意!

mrd*_*nny 14

编写表的脚本,然后使用 SSIS 传输数据将是将数据移动到新数据库的最可靠和最有效的方法。


Bra*_*adC 9

我们实际上使用了大量手动脚本和导入向导来完成它,但今天早上我找到了一个更好的答案,由Tibor Karaszi 的博客文章提供

我们在这里感到沮丧的部分原因是SQL 2000 “DTS 导入/导出向导”通过选择“复制对象和数据”实际上使这几乎变得非常简单:

DTS 导入向导

这第三个选项包含包含索引/触发器等的能力:

高级选项

此选项已从SQL 2005/2008导入向导中删除。为什么?不知道:

2008 导入向导

在 2005/2008 中,您显然必须在 BIDS 中手动创建 SSIS 包并使用Transfer SQL Server Objects Task,其中包含 2000 向导中的所有相同选项:

SSIS 传输 SQL Server 对象任务


gbn*_*gbn 8

我会考虑编写表的脚本,或使用比较工具(例如 Red Gate)在目标数据库中生成表。还没有索引或约束。

然后我会考虑在同一台服务器上使用不同的名称恢复数据库并执行

 INSERT newdb.dbo.newtable SELECT * FROM olddb.dbo.oldtable
Run Code Online (Sandbox Code Playgroud)

.. 对于每个表,如果需要,使用 SET IDENTITY INSERT ON

然后我会在加载数据后添加索引和约束。

这取决于您对 SSIS 的熟悉程度(mrdenny 的回答),或者您是否更喜欢原始 SQL。


Mar*_*ian 6

我要补充丹尼先生的回答:编写表格模式的脚本,然后使用 BCP 移动数据。如果您不熟悉 SSIS,那么使用 BCP 和批处理应该很容易做到。对于数百万行,没有什么比 BCP(批量插入)更好的了 :)。