2011-04-27 74 views
0

我需要创建一个能够合并客户端生产数据库的工具。 通常这些数据库将具有相同的模式(稍后我会做一些检查,但现在我们假设它是)。过滤重复数据也是以后的事情。 这需要自动完成(所以不需要通过SSMS等生成脚本)。 我已经不得不重新开始了几次,因为每次遇到问题时我都没有想到,所以这次我想在重新开始之前向你们征求建议。合并数据库 - 标识列丢弃

我的行动目前的计划是:从数据库1(以后我会在这里添加一些检查

  • 复制架构时的模式是不同的
  • 遍历所有表,并设置所有外国到级联密钥更新,和 设置在其中资料表需要被插入的顺序(从而含有PK的第一个,那么,保持表中 表中的FK的)
  • 环以正确的顺序每个表

    • 登记数据库2表标识列,如果是这样,检索从相应的表中的 当前种子值在数据库1,数据库2的表中删除 身份属性和更新每个ID NEWID = currentID +种子(避免重复的主键以后)
    • 生成插入脚本(SMO的Table.EnumScript)数据库表1
    • 生成数据库表2
    • 插入脚本(SMO的Table.EnumScript)执行每行数据库1将脚本插入新数据库
    • 执行数据库2插入脚本的每一行(现在有,将遵循在数据库1中所主 键/标识字段数据)对新数据库
  • 转到下表

测试时一切正常(在SSMS中禁用标识属性,创建T-SQL脚本以更新每个行与给定的种子,..) 但现在的问题是在C#中自动执行此操作,更具体的禁用身份财产。似乎没有一个干净的解决方案。创建一个新表并重建每个约束等似乎是错误的方式,因为我需要它的唯一原因是级联每个FK,所以一切仍然指向正确的位置。

另一种方式是延迟更新标识列数据,并在脚本生成之后和插入新数据库之前对其进行更改。但是后来我需要知道哪些数据指向哪些其他数据,而一切仍然在字符串(insertscript)?

有关如何处理此问题的任何建议,想法或技巧?

我知道红门的SQL比较,它确实是非常棒的,但需要自己编写它。

使用:SMO,SQL Server 2005 - 2008R2(无客户端服务器上的开发人员或企业版),ADO.NET,C#,.NET Framework 2。0时,Visual Studio 2008

+0

要链接没有标识的行,可以使用GUID作为非键列。 – Dalex 2011-04-27 09:52:42

+0

我写了一个ETL来基本做到这一点,而不必删除IDENTITY属性。我添加了一个虚拟列来跟踪旧ID并将它们插入到地图中,然后从地图上更新所有FK。长话短说,我遇到的一个问题是,我看不到你在这里处理的是循环引用。 – 2011-06-25 05:12:41

回答

1

我不知道你想正是在此处与自己的过程来完成,但管理数据库的版本是,我有浓厚的兴趣的东西。
看一看DBSourceTools(http://dbsourcetools.codeplex.com)。
这是一个将整个数据库写入磁盘的实用程序,包括所有外键约束和数据。
使用部署目标,您将能够在另一个数据库服务器(通常是本地计算机)上重新创建这些数据库。
该工具将使用Sql批量插入处理依赖性和大型数据库表 - 试图用50,000个插入语句生成脚本将是一场噩梦。
玩得开心。

免责声明:我参与了http://dbsourcetools.codeplex.com项目。