在 SQL Server 2008 中将多个数据库合并为具有多个架构的单个数据库

在 SQL Server 2008 中将多个数据库合并为具有多个架构的单个数据库

我在单个 SQL Server 2008 实例中拥有五个小型数据库。这些数据库是相关的(按业务实体相关,但不按数据相关),因此我想将它们合并到一个数据库中,并在该数据库中为每个数据库赋予自己的架构。

实际上,我希望主数据库保留dbo架构。最初,我首先在主数据库中创建架构,然后编写脚本来创建要移动的第一个数据库中的表以创建结构,然后运行插入/选择查询来迁移数据。我同意这样做,但这很耗时,我甚至还没有开始存储过程。此外,其中一个数据库依赖于记录 ID,只需执行插入/选择就会将它们抛出。

当然有更简单的方法可以做到这一点。

我不是 DBA,但我擅长在 SSMS 中处理查询等。我正在开发服务器上工作,我是唯一更新数据的人,因此如果出现问题,我总是可以从生产服务器恢复。任何指点都将不胜感激。

答案1

我找到了一个解决方案,我将在这里发布它,以防将来有人需要它。我不能说这是最好的方法,但它对我来说很有效,而且相对来说没有麻烦。我还要提前透露,当我第一次问这个问题时(一两周前),我在主数据库中创建了新的模式,所以我真的不知道这一步是否必要。

我对每个数据库都重复了此过程。

  1. 为数据库创建唯一的模式名称。

  2. 对数据库中的每个表运行以下查询:

    ALTER SCHEMA [new_schema_name] TRANSFER [table_name];

  3. 使用 SSMSCREATE为所有视图、存储过程、触发器和函数生成脚本。(幸运的是,我只有几个这样的脚本,所以这个过程很快。)我确实必须将架构名称附加到所有表引用(例如[dbo].[table_name]更改为,[new_schema_name].[table_name]但搜索和替换使这个过程变得快速而简单。

  4. 使用 SQL Server 导入和导出向导将表从数据库导出到主数据库。

  5. 运行CREATE脚本并删除旧数据库。

答案2

看一下RedGate 的 SQL 比较。它可能可以满足您的要求,或者至少让您更接近目标。它不是免费的,但您可以评估它是否有效。在我看来,它物有所值(他们的所有工具都是如此)。

答案3

至于 ID,有一个语句可以设置 ID。我相信重新播种身份。我赞同 Redgate 比较/数据压缩包 - 太棒了。

不过我不明白你为什么要这么做。这会让你同时备份和恢复所有对象。你还必须重构你的应用程序代码。你认为这样做有什么好处?

答案4

由于只有一个 SQL Server 实例,并且假设没有重叠,因此您可以使用:

SELECT * 
  INTO [NEW_DATABASE].dbo.[TABLE]
  FROM [OLD_DATABASE].dbo.[TABLE]

在运行该语句之前,新数据库中的表不能存在,但它会带来数据。

相关内容