合并数据库 - 标识列删除

时间:2011-04-27 09:37:24

标签: c# .net sql-server tsql smo

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

我目前的行动计划是:

  • 从数据库1复制架构(稍后我会在这里添加一些检查 当架构不同时
  • 遍历所有表并将所有外键更新设置为级联,并且 设置tabledata需要插入的顺序(所以 首先包含PK的表,然后是包含FK的表)
  • 以正确的顺序循环每个表

    • 在数据库2表中检查标识列,如果是,则检索 数据库1中相应表的当前种子值,drop 数据库2表上的标识属性,并将每个标识更新为newID = currentID + seed(以避免以后重复的主键)
    • 为数据库1表生成插入脚本(SMO的Table.EnumScript)
    • 为数据库2表生成插入脚本(SMO的Table.EnumScript)
    • 执行新数据库中数据库1插入脚本中的每一行
    • 执行数据库2插入脚本(现在具有主要脚本)中的每一行 密钥/标识字段数据将跟随数据库1)在新数据库上的数据
  • 转到下一个表格

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

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

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

我知道Red Gate的SQL比较,它确实很精彩,但需要自己编程。

使用:SMO,SQL Server 2005 - 2008R2(客户端服务器上没有开发人员或企业版),ADO.NET,C#,.NET framework 2.0,Visual Studio 2008

1 个答案:

答案 0 :(得分:1)

我不确定您在此处使用您的流程完成了什么,但管理数据库版本是我非常感兴趣的事项。
看看DBSourceTools(http://dbsourcetools.codeplex.com) 它是一个将整个数据库编写到磁盘的实用程序,包括所有外键约束和数据 使用部署目标,您将能够在另一个数据库服务器(通常是本地计算机)上重新创建这些数据库 该工具将使用Sql批量插入处理依赖项和大型数据库表 - 尝试生成包含50,000个插入语句的脚本将是一场噩梦。
玩得开心。

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