合并数据库——删除标识列

本文关键字:标识 删除 合并 数据库 | 更新日期: 2023-09-27 17:53:03

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

我目前的行动计划是:

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

    • 检查数据库2表中的标识列,如果是,检索删除数据库1中对应表中的当前种子值数据库2表上的identity属性,并将每个ID更新为newID =currentID + seed(避免以后出现重复主键)
    • 为数据库1表生成插入脚本(SMO的table . enumscript)
    • 为数据库2表生成插入脚本(SMO的table . enumscript)
    • 在新数据库
    • 上执行数据库1中插入脚本的每一行
    • 执行数据库2中的每一行插入脚本(现在有primary在新数据库
    • 上,键/标识字段数据将跟随数据库1中的数据
  • 转到下一张

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

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

关于如何处理这个问题,有什么建议、想法或技巧吗?

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

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

合并数据库——删除标识列

我不确定您在这里的过程中究竟想要完成什么,但是管理数据库版本是我非常感兴趣的事情。
看看DBSourceTools (http://dbsourcetools.codeplex.com)。
它是一个将整个数据库(包括所有外键约束和数据)脚本化到磁盘的实用程序。使用部署目标,您将能够在另一个数据库服务器(通常是本地计算机)上重新创建这些数据库。
该工具将使用Sql Bulk插入来处理依赖关系和大型数据库表——试图生成一个包含50,000条插入语句的脚本将是一场噩梦。获得乐趣。

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