如何将架构和一些数据从SQL Server复制到另一个实例?

时间:2011-08-30 15:33:35

标签: sql sql-server sql-server-2005

我的产品使用SQL Server数据库 - 每个客户端在自己的Intranet上都有自己的已部署实例。 db有大约200个表。它们中的大多数是只有几行的配置表,但是有几个可能有几百万行的事务数据表。我经常需要解决客户的配置问题,所以我需要他们的数据库副本才能在我的开发系统本地工作...但是由于交易数据可能会非常大,这使得客户很难发送我是一个备份工作。我需要一种方法来备份/复制/导出大表的所有内容。

理想情况下,大型表确实属于单独的数据库目录,因此客户可以将其“数据”与其“配置”分开备份。但是,我没有权限进行这种类型的更改,因此我正在寻找一种很好的方法来导出或复制配置部分而无需复制整个部分。

目前我有一个快速而又脏的.NET应用程序,它使用SQL Adapter和DataSet从所有表中盲目地选择*除了我要省略的那些,将其转储到XML文件(这是我的穷人的导出功能)。我有一个伴侣应用程序,我可以在本地使用将XML加载回DataSet,然后使用SQLBulkCopy将其加载到我的开发数据库中。我不得不做一些技巧来禁用约束等等,但我让它成功了。这让我得到了数据,但不是模式....理想情况下,我想要一种方法来获取模式。这是一种蛮力的方法,我相信必须有一种更简单的方法。有关更好方法的任何建议吗?

解决方案需要自动化,因为我正在与通常几乎没有IT支持的最终用户打交道。

(SQL 2005及更高版本)

4 个答案:

答案 0 :(得分:13)

你能直接从SSMS生成脚本吗?

  1. 右键单击数据库
  2. 选择任务 - >生成脚本
  3. (如果您获得介绍屏幕,请单击“下一步”)
  4. 选择“选择特定数据库对象”
  5. 选择对象以生成脚本(表,存储过程等等)
  6. 单击“下一步”,然后指定输出文件名
  7. 单击“完成”以生成脚本
  8. 这将仅生成模式。如果您还要执行数据生成脚本,请在步骤6)中单击“高级”按钮并向下滚动到“脚本数据类型”,然后将其从“仅架构”更改为“仅数据”或“架构和数据”

    在您的情况下,您可以为所有小配置表执行“架构和数据”,然后对不希望导出数据的大型表执行“仅架构”。

    我知道这不是完全自动化的,但它非常接近。如果您想进一步查看自动化,请查看此主题。不确定这是否适用于SQL 2005:

    How can I automate the "generate scripts" task in SQL Server Management Studio 2008?

答案 1 :(得分:11)

因为我们过去遇到过类似的问题,所以只有几条评论。

SSMS中的“生成脚本”选项非常适合小型数据库,您可以在这些小型数据库中手动重新排序单个脚本并避免依赖性问题。不确定为什么这么多人建议使用这个具有依赖性问题的功能。

对于大型数据库,只有您自己创建或使用第三方工具才能获得可行的解决方案。

我们最终使用了此third party tool。 SQL Packager在我们评估时工作得更好但我们设法基本上免费获得其他工具......

无论如何,希望这有帮助,即使这是一个迟到的回答/评论...

答案 2 :(得分:2)

我解决了它如下。我创建了一个自定义winform应用程序来导出他们的数据:

  1. 使用SMO(传输类)将整个架构编写为.sql文件
  2. 使用:select * from
  3. 循环遍历所有指定的表(实际上我只列出了要忽略的大增长表,并处理其他所有表)
  4. 将记录捕获到DataTable对象中并将其转储到.xml文件
  5. 将整个文件夹拉出来发送回给我
  6. 我有一个自定义的winform应用程序,我在我的开发系统上本地使用来导入数据:

    1. 创建一个空数据库
    2. 运行.sql文件以构建架构
    3. 禁用所有表的所有约束(使用sp_foreachtable)
    4. 遍历所有.xml文件并使用SqlBulkCopy对象批量导入它们
    5. 重新启用所有约束(使用sp_foreachtable)
    6. 这种方法适用于我的数据库,但我不一定会为某些数据库设计提供建议。在我的例子中,有许多“小”配置表,只有少数“大”表,它们之间的关系最小,所以我可以很容易地忽略大的。如果有更复杂的关系,那可能不是一个好的解决方案......

      到目前为止似乎工作得很好。我希望在没有编写自定义代码的情况下找到一个很好的方法来实现这一点,但我只需要几个小时的开发时间就可以了。

      仅供参考,我几乎让它与sqlpubwiz一起工作,但脚本数据的选项是全有或全无......你不能忽略特定的表......这对我的应用来说是一个交易破坏者。 SMO中的Transfer对象是一个非常有用的类 - 它只需要几行代码来编写整个数据库模式的脚本,包括正确创建顺序中的所有依赖项,从头开始重新创建数据库!

      http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.transfer.aspx

答案 3 :(得分:0)

在Red Gate,我们有一个名为SQL Packager的工具,它有一个可以自动执行此任务的命令行。这使用了引擎盖下的SQL Compare和SQL Data Compare引擎。我有兴趣得到您对这是否满足您的用例的反馈。

http://www.red-gate.com/products/sql-development/sql-packager/